Сделайте снимки экрана в фоне тихо в целях архива

Во время моей работы я часто испытываю инструменты другой сложности и разрабатываю сценарии интеграции и использование.

Я использую Ubuntu 18.04 LTS.

Иногда, если вещи являются действительно сложными, я не всегда уверен, как точно я добрался до решения, и для документации и целей обмена знаниями, я провожу дополнительное время, чтобы стать больше знающим об аккуратном и очевидном способе с менее бездельничанием, сделать снимки экрана и так далее.

Затем я думал, что будет замечательно иметь экранный инструмент получения, чтобы сделать снимок, говорят каждые 30 секунд тихо в фоне так, чтобы я мог:

  • Легко резюмируйте мои шаги и также глюки
  • Если я удачлив, непосредственно используйте снимки экрана от этого архива изображений для документации.

Я думал, что, например, настрою cronjob для затвора, но в то время как я уже использую его, существует ошибка, "у Вас уже есть выполнение экземпляра затвора". Я попробую теперь scrot.

Какие-либо лучшие идеи?

ОБНОВЛЕНИЕ: Для управляемого выполнения Крона, поскольку этот инструмент не может разрешить временные интервалы меньше чем одна минута, здесь решение (на менее расчетных ответов в потоке) в течение каждых 30 секунд.

* * * * * /bin/bash -l -c "/path/to/executable; sleep 30 ; /path/to/executable"
4
задан 12 October 2018 в 11:32

7 ответов

Я только что начал изучать Ubuntu.
Я не знаю, что этот метод правилен или нет.
Я Мог достигнуть его в ниже пути.

Я создал сценарий как названный ScreenShot.sh в папке,/usr/local/bin

#!/bin/bash

# NAME: ScreenShot.sh
# PATH: /usr/local/bin
# DESC: Take Screenshots at every specified intervals with "watch -n 10 ScreenShot.sh" Command
# DATE: Oct 12th 2018

sudo gnome-screenshot -d 0

sudo chmod a+x /usr/local/bin/ScreenShot.sh

когда я запускаю систему и требуемый для запуска снимка экрана в каждом 10secs,

я выполняю эту команду

sudo watch -n 10 ScreenShot.sh

я настроил свою папку по умолчанию, тип изображения, который будет сохранен с dconf редактором в gnome-screenshot раздел.

enter image description here

enter image description here

enter image description here

В звуки заходят dconf настройки под звуковым разделом

enter image description here

8
ответ дан 23 November 2019 в 11:36

Я делаю то же самое. Это - сценарий, который я записал, названный screenlog-capture:

#! /bin/bash
window_name() {
  xwininfo -id "$1" | \
    grep "^xwininfo: Window id" | \
    LC_CTYPE=C LC_COLLATE=C sed  's/^[^"]*"\(.*\)"$/\1/' | \
    sanitize-filename
}

window_class() {
  xprop -id "$1" | grep "^WM_CLASS(STRING)" | cut -d '"' -f 4
  # Or we could use _NET_WM_PID(CARDINAL) -> process name
}

if [ ! -d "$RAMTMP" ]
then
  echo "RAMTMP needs to be set."
  exit 1
fi
if [ ! -e /usr/bin/puzzle-diff ]
then
    echo 'Error: puzzle-diff not installed!'
    exit 1
fi

rootdir="$HOME/screenlog"
if [ ! -w "$rootdir" ]
then
  echo 'Error: screenlog dir not writable'
  exit 1
fi
if [[ $(qdbus org.cinnamon.ScreenSaver /org/cinnamon/ScreenSaver org.cinnamon.ScreenSaver.GetActive) == true ]]
then
  exit
fi
du=$(df -Plh "$rootdir" | sed -n -e '2s/.* \([0-9]\+\)% .*/\1/' -e '2p')
if [ "$du" -ge 98 ]
then
  exit
fi
win_id=$(xprop -root | grep "^_NET_ACTIVE_WINDOW(WINDOW)" | cut -d ' ' -f 5)
win_name=$(window_name "$win_id")
parent_id=$(xprop -id "$win_id" | grep "^WM_TRANSIENT_FOR(WINDOW)" | cut -d ' ' -f 5)
if [ "$parent_id" ]
then
  win_class=$(window_class "$parent_id")
else
  win_class=$(window_class "$win_id")
fi
case "$win_class" in
  # Firefox-bin is full-screen YouTube video (for example)
  Gq|Geeqie|GQview|Firefox-bin|Plugin-container|Gimp|mplayer2)
    exit
    ;;
esac
case "$win_name" in
  *'Internet Bank'*|*'YouTube'*|MPlayer|Netflix*|Prime\ Video*)
    exit
    ;;
esac

tmpfilename="$RAMTMP/screenlog-capture.png"
scrot -buq 0 "$tmpfilename"
if [ ! -s "$tmpfilename" ]
then
  exit
fi
if [ $(stat -c %s "$tmpfilename") -lt 500000 ]
then
  mogrify -depth 3 "$tmpfilename"
else
  mogrify -type Grayscale -depth 3 "$tmpfilename"
fi
latest="$rootdir/latest.png"
puzzle-diff -c -e -E 0.1 "$latest" "$tmpfilename" &>/dev/null
if [ $? -eq 10 ]
then
  # No relevant changes, don't keep screenshot
  rm "$tmpfilename"
else
  win_name="$(printf %.30s $win_class) - $(printf %.60s $win_name)"
  date=$(date '+%Y-%m/%Y-%m-%d')
  dirname="$rootdir/$date"
  mkdir -p "$dirname"
  filename="$dirname/$(date '+%H.%M.%S') $win_name.png"
  mv "$tmpfilename" "$filename"
  rm -f "$latest"
  ln -s "$filename" "$latest"
fi

Некоторые интересные функции:

  • Это использует scrot сделать снимки экрана.
  • Это включает название текущего окна в имени файла, делая поиск легче.
  • Это не работает, если экранная заставка работает (это является Определенным для корицы, для других рабочих столов будет нужна другая команда для проверки на состояние экранной заставки).
  • Это отфильтровывает некоторые приложения, из которых я не хочу делать снимки экрана, этот список может быть легко расширен.
  • Это прекращает делать снимки экрана, если использование диска выходит за предел 98%.
  • Это использует puzzle-diff пропускать сохранение снимка экрана, если это совпало бы с предыдущим (с некоторым допуском).
  • Это радикально уменьшает глубину цвета снимков экрана (или даже делает их шкалой полутонов, в зависимости от размера) сохранить дисковое пространство.
  • Я использую псевдодиск для промежуточного устройства хранения данных (прежде чем решение, сохранить ли изображение), но можно использовать обычное/tmp местоположение также.

Я использую другой сценарий оболочки, screenlog, называть этого периодически:

#! /bin/bash
while true
do
  sleep 5
  screenlog-capture
done
4
ответ дан 23 November 2019 в 11:36

Я придумал

#! /usr/bin/env bash

sleep_period=30s

while true; do

scrot $HOME/Pictures/"$(date +%Y%m%d%H%M%S)".png

sleep ${sleep_period}
done

Я имею ~/bin и таким образом, я сохранил этот сценарий там как continuous-scrot.sh и сделанный этим исполняемый файл. Для выполнения его я открываю окно терминала и ввожу имя сценария и нажимаю Enter. Я оставляю это окно терминала, активные и полноэкранные снимки экрана получены каждый 30-е в Вашем ~/Pictures папка. Для остановки просто вернитесь к этому окну терминала и нажмите Ctrl+C.

2
ответ дан 23 November 2019 в 11:36

Так как у меня есть много дистрибутивов Linux, где мне нужны снимки экрана, и они используют различные менеджеры окон, я использую, вероятно, самую старую из утилит снимка экрана xwd. Это - часть распределения XServer, таким образом, я могу быть уверен, что это установлено каждый раз. Я не уверен, распределяется ли это и если это работает с Уэйлендом. Команда

xwd -display :0.0 -root -out screenshot.xwd

должен сделать снимок экрана корневого окна дисплея:0.0. Выходной файл является специальным отформатированным файлом дампа. ImageMagick может преобразовать тот файл в некоторый более распространенный формат. Для получения дополнительной информации: https://linux.die.net/man/1/xwd.

Можно найти много идей, как выполнить такую утилиту на равных интервалах в других ответах. Для создания вывода в другой файл каждым разом, Вы могли сделать:

xwd -display :0.0 -root -out "$(date).xwd"
1
ответ дан 23 November 2019 в 11:36

Я использовал бы recordmydesktop, возможно с низким уровнем кадр/с и никаким аудио для сокращения зарегистрированного объема данных.

В то время как это не точно снимки экрана, но полное видео, преимущество состоит в том, что Вы получаете хорошее сжатие как, только различия между последовательными изображениями должны быть сохранены, у Вас есть опция также записи Вашего микрофона, таким образом, можно сделать заметки путем разговора, и можно дополнительно добавить, запускаются/кнопки остановки к системной области уведомлений.

1
ответ дан 23 November 2019 в 11:36

Первая вещь, о которой я могу думать, состоит в том, чтобы открыть терминал и использовать его для издания scrot в некоторое время со сном. Что-то вроде этого:

while sleep 30; do scrot <whatever>; done

Мне существует выгода в этом. Что, если Вы делаете что-то значительным между 30 secs интервалами? Вы рассмотрели устройство записи экрана (SimpleScreenRecorder является одним доступным на распределении человечности. другим именем, которое я вспоминаю, является Стамбул),

0
ответ дан 23 November 2019 в 11:36

Как я решил это для меня:

Во-первых, установите следующий cronjob:

* * * * * DISPLAY=:0 /usr/bin/sudo -i -u <USER> bash -c '/home/<USER>/bin/create-screenshot.sh; sleep 30; /home/<USER>/bin/create-screenshot.sh;'

Заметьте DISPLAY=:0 оператор, чтобы позволить крону получать доступ к X-серверу.

Затем создайте ~/bin/create-screenshot.sh со следующим содержанием:

#!/bin/bash

user="<USER>"
folder="$(date +%Y%m%d)"
y="$(date +%Y)"
m="$(date +%m)"

mkdir -p "/home/$user/screenshots/$y/$m/$folder"
file="$(date +%Y%m%d%H%M%S)".png
path="/home/$user/screenshots/$y/$m/$folder/$file"
scrot $path
0
ответ дан 23 November 2019 в 11:36

Другие вопросы по тегам:

Похожие вопросы: