作業中、私はしばしば異なる複雑さのツールを試し、使用と統合のシナリオを開発します。
Ubuntu 18.04 LTSを使用しています。
物事が本当に複雑になった場合、ソリューションにどれだけ正確に到達したかが常にわからないことがあります。ドキュメントや知識の共有のために、[lessいじって、スクリーンショットを撮るなど。
それから、30秒ごとに写真を撮るスクリーンキャプチャツールがあればいいと思いましたサイレントモードで
たとえば、シャッター用のcronjobを設定すると思いましたが、すでに使用しているときに、「すでにシャッターインスタンスを実行しています」というエラーがあります。今からscrotで試してみます。
より良いアイデアはありますか?
UPDATE:Cron管理実行の場合、このツールは1分未満の時間間隔を解決できないため、ここでは ソリューション (スレッド内の低い評価の回答の)30秒ごと。
* * * * * /bin/bash -l -c "/path/to/executable; sleep 30 ; /path/to/executable"
Ubuntuの学習を始めました。
この方法が適切かどうかわかりません。
以下の方法で達成できました。
/ usr/local/binフォルダーにScreenShot.shという名前のスクリプトを作成しました
#!/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
システムを起動し、10秒ごとに画面キャプチャを開始したい場合、
このコマンドを実行します
Sudo watch -n 10 ScreenShot.sh
gnome-screenshot
セクションにdconfエディターを使用して、保存するイメージタイプをデフォルトフォルダーに設定しました。
サウンドは、サウンドセクションのdconf設定によって停止されます
私も同じことをします。これは、私が書いた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
を使用してスクリーンショットを撮ります。puzzle-diff
を使用して、スクリーンショットの保存が以前のものと同じ場合(ある程度の許容差はある)、保存をスキップします。別のシェルスクリプトscreenlog
を使用して、これを定期的に呼び出します。
#! /bin/bash
while true
do
sleep 5
screenlog-capture
done
思いついた
#! /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。このターミナルウィンドウをアクティブのままにして、フルスクリーンのスクリーンショットが~/Pictures
フォルダーに30秒ごとにキャプチャされます。停止するには、このターミナルウィンドウに戻り、 Ctrl+C。
スクリーンショットが必要なLinuxディストリビューションが多数あり、さまざまなウィンドウマネージャーを使用しているため、おそらく最も古いスクリーンショットユーティリティxwdを使用します。これはXServerディストリビューションの一部であるため、毎回確実にインストールされます。それが配布されているかどうか、そしてウェイランドで動作するかどうかはわかりません。コマンド
xwd -display :0.0 -root -out screenshot.xwd
display:0.0のルートウィンドウのスクリーンショットを作成する必要があります。出力ファイルは、特別な形式のダンプファイルです。 ImageMagickは、そのファイルをより一般的な形式に変換できます。詳細: https://linux.die.net/man/1/xwd 。
他の回答では、このようなユーティリティを定期的に実行する方法について多くのアイデアを見つけることができます。できるたびに異なるファイルに出力するには:
xwd -display :0.0 -root -out "$(date).xwd"
記録されたデータの量を減らすために、おそらく低fpsレートで音声なしのrecordmydesktop
を使用します。
これらは正確なスクリーンショットではなく、完全なビデオですが、利点は、連続する画像間の違いのみを保存する必要があるため、優れた圧縮が得られることです。オプションで、システム通知領域に開始/停止ボタンを追加できます。
私が自分でこれをどのように解決したか:
まず、次の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
ステートメントに注目して、cronが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
私が最初に考えることができるのは、ターミナルを開いて、スリープ状態でしばらくしてからscrotを発行することです。このようなもの:
while sleep 30; do scrot <whatever>; done
私には、これには問題があります。 30秒の間隔の間に何か重要なものを作成するとどうなりますか?スクリーンレコーダーを検討したことがありますか(SimpleScreenRecorderはUbuntuディストリビューションで利用可能なものです。別の名前はIstanbul))