2022年4月3日日曜日

Linuxで特定のプロセスが稼働中の時だけスクショを取らせる

絵を描いているとどうしても過程を撮っておこうとして忘れるのでCronとシェル芸で数分毎に撮ってもらうことにした。

Arch Linux + fcron + scrot

$HOME/bin/capture.sh

#!/bin/bash
ps -A | grep -q azpainter > /dev/null &&
env DISPLAY=:0 > /dev/null scrot "/home/fahrenheit/Pictures/screenshot/azpainter-auto/%Y-%m-%d_%H-%M-%S.png"

プロセス一覧を出してgrep検索してヒットしたらスクショが発動する。ちなみにこれだとAzPainterBもたぶんヒットしてしまうんだけどまぁ撮ってて損はないのでおkとします。

CronはDISPLAY=:0しないとGUI関連が動かないらしいので入れておく。

fcrontab -e

PATH=$PATH:/usr/local/bin:/usr/bin:/home/fahrenheit/bin
MAILTO=""

00 * * * * fahrenheit /home/fahrenheit/bin/capture.sh
20 * * * * fahrenheit /home/fahrenheit/bin/capture.sh
40 * * * * fahrenheit /home/fahrenheit/bin/capture.sh

とりあえずこれで20分毎に1回撮影するようになる。

問題なのはソフトを開きっぱなしだと作業をサボってブラウザを開いたりしていても撮ってしまうところで作業しない間はしっかりと閉じておかないといけない。サボるな。


追記:さぼってもいいようにした(クソ)

#!/bin/bash
azpid=$(DISPLAY=:0 xwininfo -root -tree | grep "\- AzPainter" | awk -F " " '{print $1}')
ps -A | grep -q azpainter > /dev/null &&
DISPLAY=:0 xwininfo -id "$azpid" | grep "IsViewable" &&
env DISPLAY=:0 > /dev/null scrot "/home/fahrenheit/Pictures/screenshot/azpainter-auto/%Y-%m-%d_%H-%M-%S.png" &&
echo "OK."

xwininfoというやつでウィンドウが画面上に見えているかどうかを取得できるらしいのだけど、ウィンドウid指定・タイトルバーの名前指定・クリックで直接指定、しか値を取得するウィンドウを選べないので、開くファイルごとにタイトルバーが変わってしまうペイントソフトを自動的に取得させるためにはidしかなく、最初に再帰的に全ウィンドウを取得してgrepでペイントソフトを取り出してawkでウィンドウidだけを切り出す。

ワークスペースの切り替えや他ソフトのフルスクリーンなどをしているとIsUnviewable、画面がちょっとでも見えているとIsViewableになる。

てかこれあったらpsコマンドいらんくね・・・?

0 件のコメント:

コメントを投稿