シェルスクリプト内で、タイトルに文字列が含まれているウィンドウが表示されるのを待ち、何らかのアクションを実行してから、ウィンドウが消えるのを待ち、その他のアクションを実行する必要があります。
昨日まで、私はこの単純なコードを持っていました。この問題は、スクリプトの実行中にディスクを省電力状態にすることができず、長時間続く可能性があることです。
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に書き込んだとしても)。
fatrace
ディスクのウェイクアップをチェックするために使用していbash
ます。これにより、読み取り/bin/sleep
と/usr/bin/wmctrl
0.5秒ごとに通知されます。そのため、実際にウィンドウイベントを待機するプログラムを探しています。何か不足していますか?
btrace
、からも参照してくださいblktrace
。
xwininfo
wmctrlよりも確かに負荷をはるかに少ない共有ライブラリを、使用のかもしれないし、近い裸Xにレベルで動作
strace -f -e trace=file wmctrl -l
参考になると思います。