Xウィンドウが表示されるか消えるまで待ちます(一般的な方法)

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にいくつかの情報を書き込む場合でも)!

答え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から起動すると、ディスクを直接起動する可能性はありません。ファイルシステム階層への書き込みはディスクに書き込まれません。

関連情報