Xウィンドウが現れる/消えるのを(正気に)待つ


11

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

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

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
古いコードがディスクを呼び起こして解決策を探す理由を理解するのは理にかなっていますか?chrootやramdiskのようなもの。strace -f -e trace=file wmctrl -l参考になると思います。
Hauke Laging 2013年

私はfatraceディスクのウェイクアップをチェックするために使用していbashます。これにより、読み取り/bin/sleep/usr/bin/wmctrl0.5秒ごとに通知されます。そのため、実際にウィンドウイベントを待機するプログラムを探しています。何か不足していますか?
テレサeジュニア

1
毎秒2回実行するとキャッシュされる可能性があるため、これらを読み取ってもディスクは起動しません。noatimeでファイルシステムをマウントしましたか?ディスクアクティビティのソースを調査するにはbtrace、からも参照してくださいblktrace
ステファンChazelas

1
あなたはそれを見ていない場合は、まだxwininfowmctrlよりも確かに負荷をはるかに少ない共有ライブラリを、使用のかもしれないし、近い裸Xにレベルで動作
MSW

1
@msw修正不能なものを修正しようとしています。これは、Google Earthの自動保存機能です(クローズされたソースおよびバグの報告は時間の浪費です)
Teresa e Junior

回答:


4

これにより、書き込みを含むすべての(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

この情報を使用して、tmpfsで動作するchroot環境を作成できます(最後の手段として、tmpfsへのシンボリックリンクで十分です)。プログラムがRAM chrootで起動されている場合、ディスクを直接起動することはできません。ファイルシステム階層への書き込みがディスクに書き込まれることはありません。


少なくとも初めてファイルを読み取るときに、ディスクもスリープ解除することがありますよね。場合、私は思ったんだけどblktrace、そのための適切なツールになりますが、それはカーネルのコンパイルが必要になり# CONFIG_BLK_DEV_IO_TRACE is not set:(この質問の範囲を超えて、にもかかわらず、ありがとうございます。!
テレサ電子ジュニア

1
@TeresaeJuniorもちろんですが、だれがそれを問題だと考えるでしょうか。これは、スクリプトを開始することではなく、常にスクリプトを実行し続けることです。また、boot.local/ からtmpfsを作成して、rc.local後でスクリプトを開始した場合でもディスクにアクセスできないようにすることができます。私は見ただけですblktrace(以前はそれを知りませんでした)。それはとてもひどいので、私は今夜眠れるようになるのだろうか…
Hauke Laging 2013年

はい、私はこれについて本当に心配する必要はありません、あなたは再び正しいです。しかし、この特定のGoogle Earthハックだけでなく、ディスクを常に起動させている可能性のあるすべてのものをチェックしたいので、カーネルをコンパイルするこの夜の睡眠も緩めると思います:)
Teresa e Junior

6

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

シェルに必要なのは、ウィンドウマネージャーに登録し、シェルに戻る前に目的のイベントタイプを待機するものです...シェル内でのループを回避できれば、はるかにロードフレンドリーになります。(until xdotool...ループ内で遅延(スリープ)がないため、原因がロードされます。)

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

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


はい、正確に-syncは、私がしたいことをするはずでしたがwhile、ウィンドウが表示される前に最終的にクラッシュし、CPUを浪費するため、必要です。xdotoolDebianからのものはタイプするのが信じられないほど遅いので、私は実際にソースからコンパイルしました。Xと直接対話するアプリケーションを書くことは、実際には私を超えています。感謝します!
テレサeジュニア
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.