web-dev-qa-db-ja.com

Xウィンドウが現れる/消えるのを(まともな方法で)待つ

シェルスクリプト内で、タイトルに文字列が含まれているウィンドウが表示されるのを待ち、何らかのアクションを実行してから、ウィンドウが消えるのを待ち、その他のアクションを実行する必要があります。

昨日まで、私はこの単純なコードを持っていました。これに伴う問題は、スクリプトの実行中にディスクを省電力状態にできないことであり、何時間もかかる可能性があります。

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)!

11
Teresa e Junior

これにより、書き込みを含むすべての(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で開始された場合、ディスクを直接ウェイクアップする機会はありません。ファイルシステム階層への書き込みはディスクに書き込まれません。

4
Hauke Laging

「実際の」X11アプリケーションを作成してこれを処理するためにウィンドウマネージャーまたはX11に依存する方が、より簡単で信頼性が高い場合があります。

シェルに必要なのは、ウィンドウマネージャーに登録し、目的のイベントタイプを待ってからシェルに戻るものです。シェル内でのループを回避できれば、はるかに負荷がかかりやすくなります。 (きみの until xdotool...ループ内で遅延(スリープ)がないため、ロードが発生します。)

ああ...どうやらxdotoolにはその機能が1年以上前に追加された--sync。これは私の現在のLinuxディストリビューション(Debian Squeeze)では利用できないので、試していません。

あなたに似た質問に答えるxdotool開発者: https://groups.google.com/d/msg/xdotool-users/7zfKTtyWm0Q/DM6TSOBUWZMJ

6
Carl Cravens