シェルスクリプト内で、タイトルに文字列が含まれているウィンドウが表示されるのを待ち、何らかのアクションを実行してから、ウィンドウが消えるのを待ち、その他のアクションを実行する必要があります。
昨日まで、私はこの単純なコードを持っていました。これに伴う問題は、スクリプトの実行中にディスクを省電力状態にできないことであり、何時間もかかる可能性があります。
while :; do
until wmctrl -l | grep -q "$string"; do # until
sleep 0.5
done
: do action 1
while wmctrl -l | grep -q "$string"; do # while
sleep 0.5
done
: do action 2
done
上記のコードがめちゃくちゃディスクをウェイクアップしていると判断したので、いくつかのコマンドラインツールのドキュメントを調べ、ウィンドウが表示されるのを待つためにxdotool
を、図を描くためにxprop
を決定しました。ウィンドウが消えたときにアウト:
while :; do
# we use `until' because sometimes xdotool just crashes
until xdotool search -sync -all -onlyvisible -pid $pid -name "$string"; do
:
done
# xdotool isn't trustworthy either, so check again
wmctrl -l | grep -q "$string" ||
continue
: do action 1
xprop -spy -root _NET_CLIENT_LIST_STACKING | while read line; do
if [[ ! ${_line:-} || $_line = $line ]]; then
_line=$line
continue
else
_line=$line
if wmctrl -l | grep -q "$string"; then
continue
else
: do action 2
break
fi
fi
done
done
ここで、上記のコードに2つの新しい問題があります。
xdotool
は、以前に回避したように、クラッシュして奇妙な結果をもたらすだけでなく、ウィンドウが表示されるのを待っている間、CPUの約15%を消費します。つまり、ディスクをウェイクさせる単純なコードを削除して、CPUを何時間も浪費したままにするコードを記述しました。そもそも私の意図は、電力を節約することでした。xprop -spy
は、フォーカスを変更するか($_line
で回避しました)、ウィンドウを作成および破棄するたびに通知します。これにより、xdotoolよりも頻繁にディスクがウェイクアップされます。$string
というタイトルのウィンドウが表示または非表示になるのを待つだけの簡単なプログラムを探しています。これは既存のコマンドラインツール、pythonスクリプト、コンパイル可能なCコード... fifo)!
これにより、書き込みを含むすべての(OK:ほとんど。何を忘れましたか?ソケット?)ファイルシステムアクティビティが得られるはずです。
strace -f command 2>&1 |
grep -e '^open.*O_CREAT' \
-e ^write \
-e ^mkdir \
-e ^rmdir \
-e ^unlink \
-e ^rename \
-e ^chmod \
-e ^link \
-e ^symlink \
-e ^mknod
この情報を使用して、動作するchroot環境をtmpfsに作成できます(最後の手段として、tmpfsへのシンボリックリンクで十分な場合があります)。プログラムがRAM chrootで開始された場合、ディスクを直接ウェイクアップする機会はありません。ファイルシステム階層への書き込みはディスクに書き込まれません。
「実際の」X11アプリケーションを作成してこれを処理するためにウィンドウマネージャーまたはX11に依存する方が、より簡単で信頼性が高い場合があります。
シェルに必要なのは、ウィンドウマネージャーに登録し、目的のイベントタイプを待ってからシェルに戻るものです。シェル内でのループを回避できれば、はるかに負荷がかかりやすくなります。 (きみの until xdotool...
ループ内で遅延(スリープ)がないため、ロードが発生します。)
ああ...どうやらxdotool
にはその機能が1年以上前に追加された--sync
。これは私の現在のLinuxディストリビューション(Debian Squeeze)では利用できないので、試していません。
あなたに似た質問に答えるxdotool開発者: https://groups.google.com/d/msg/xdotool-users/7zfKTtyWm0Q/DM6TSOBUWZMJ