シェルスクリプトでは、タイトルに文字列を含むウィンドウが表示されるのを待ってからいくつかの操作を実行し、ウィンドウが消えるまで待ってから別のタスクを実行する必要があります。
昨日まで私はこの簡単なコードを持っていました。問題は、スクリプトの実行中にディスクがスリープ状態に入ることができず、数時間持続する可能性があることです。
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にいくつかの情報を書き込む場合でも)!
答え1
「実際の」X11アプリケーションを作成してこの問題を処理するには、ウィンドウマネージャまたはX11に依存する方が簡単で信頼性が高い場合があります。
シェルで望むのは、ウィンドウマネージャに登録し、シェルに戻る前に必要なイベントタイプを待つことです...シェル内のループを避けることができれば、読みやすい(until xdotool...
ループ内に遅延(休止)がないため、理由はロードによるものです。)
あ…xdotool
その機能は1年前に追加されたようですね--sync
。現在、Linuxディストリビューション(Debian Squeeze)ではこの機能が利用できないため、まだ試していません。
xdotoolの開発者はあなたに似た質問に答えました。 https://groups.google.com/d/msg/xdotool-users/7zfKTtyWm0Q/DM6TSOBUWZMJ
答え2
これは、書き込みを含むすべてのファイルシステムアクティビティ(わかります:ほとんど。私が忘れたことがありますか?ソケット?)を提供する必要があります。
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
この情報を使用すると、tmpfsで動作するchroot環境を作成できます(最後の手段として、おそらくtmpfsへのシンボリックリンクで十分です)。プログラムがRAM chrootから起動すると、ディスクを直接起動する可能性はありません。ファイルシステム階層への書き込みはディスクに書き込まれません。