2020年3月28日土曜日

CrontabとScrotで定期スクショを撮ってもらう

システムエンヂニアじゃないのでログファイルは全く見ないけど、絵描きなので定期的にデスクトップを撮影して保存してくれると作業経過などを見れて楽しいのではないかと思ってCronでScrotを動かして撮ってもらう話。

/etc/crontab の直接編集

Crontabで時報と時刻通知を出すようにする でも書いたけど自環境だと何故かこれでしか動いてくれないのでcrontabを直編する。
DISPLAY=:0.0
00 * * * * fahrenheit /usr/bin/scrot '\%Y-\%m-\%d_\%H-\%M-\%S_auto.png'
30 * * * * fahrenheit /usr/bin/scrot '\%Y-\%m-\%d_\%H-\%M-\%S_auto.png'
これを書き足す。(fahrenheitはユーザ名なので各々好きなように変えてね)
毎日00分と30分ごとに日時をつけて撮ったスクショをホームフォルダに置くようになる。

前記事にも書いたけど基本的にデスクトップに対して何かするプログラムはDISPLAY=:0.0を指定しないとCan't open displayなどと言って弾かれてしまい撮れないので、指定しておく。

Scrotの日付入力はパーセント記号を使うが、コマンドラインと違って%の前にバックスラッシュでエスケープしないと「Syntax error: Unterminated quoted string」 といって撮れなくなってしまう。(Vimでcrontabを見るとクォートした部分のハイライトがおかしくなっているので分かりやすい)
※↑の表示だと斜体のせいでパイプに見えちゃうけどバクスラです

ないと思うけどTTY1でデスクトップを起動していたけどTTY2のCUI画面で作業をしていた……という時はこんがり焦げた真っ黒な画像が出来上がる。

縮小や保存ディレクトリ指定

昨今の解像度の高いディスプレイでは全画面撮影したものをジャンジャン撮られると容量を圧迫してしまうので、mogrify(imagemagick)コマンドで縮小させて Pictures/ss フォルダに移動させたい。

Scrotは -e オプションで撮ったスクリーンショットに対してコマンドを実行できる。

DISPLAY=:0.0
00 * * * * fahrenheit /usr/bin/scrot '\%Y-\%m-\%d_\%H-\%M-\%S_auto.png' -e 'mogrify -resize 800x450 $f ; mv $f /home/fahrenheit/Pictures/ss/'
30 * * * * fahrenheit /usr/bin/scrot '\%Y-\%m-\%d_\%H-\%M-\%S_auto.png' -e 'mogrify -resize 800x450 $f ; mv $f /home/fahrenheit/Pictures/ss/'
-e オプションの引数をダブクオで囲むとあんまりよく動かなかった……かもしれない。

ついでにsedのごとく-e オプションを複数つけて連続編集させられるのかと思ったら最後の-eしか適用してもらえなかったので、ひとつの-eの中にセミコロンで繋いだコマンドを詰め込む。
一応フルパスにしたけど別に $HOMEとかチルダ(〜)にしても良かったかもしれない…?
などなど不安な点がいくつもあるけどとりあえず動いたのでこれでヨシとします。

TTY画面で撮られた真っ黒画像を一括で消す

rmコマンドを使うのでちょっと危ないかもしれないしもっと上手い書き方があるかもしれない……。
ls -lS Pictures/ss/auto | grep "    315" | awk -F" " '{print "Pictures/ss/auto/"$9}'| xargs rm 
自環境(1920x1080)だと黒画面で315bytesの画像が出来上がるので、lsとgrepで315bytesのファイルだけを出してawkでファイル名だけを切り出す。
315だけだと12315bytesとかのファイルを巻き込んでしまうのでgrepでケタ揃えに使われたスペースを含めて"   315"として検索。

.zprofileや.bash_profileなどのログイン時実行のところに書き込んでおいたりすればログインした時に一括で吹っ飛ばしてくれる。

0 件のコメント:

コメントを投稿