Bash

等待 X 視窗出現/消失(以理智的方式)

  • May 7, 2013

在 shell 腳本中,我需要等待一個標題上有一個字元串的視窗出現,執行一些操作,然後等待它消失,然後執行一些其他操作。

直到昨天,我才有了這個簡單的程式碼。它的問題是在腳本執行時磁槃無法進入省電狀態,並且可能會持續數小時:

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

現在我對上面的程式碼有兩個新問題:

  • xdotool正如我之前解決過的那樣,不僅崩潰並給出奇怪的結果,而且在等待視窗出現時它還會佔用大約 15% 的 CPU。所以這意味著我擺脫了喚醒磁碟的簡單程式碼,編寫了浪費 CPU 數小時的程式碼,而我的初衷是節省電力。
  • xprop -spy每次我改變焦點(我已經解決$_line)或創建和銷毀視窗時都會通知我。這比 xdotool 更頻繁地喚醒磁碟。

我正在尋找一個簡單的程序,它只是等待帶有標題的視窗$string出現或消失。它可以是現有的命令行工具、python 腳本、可編譯的 C 程式碼……,但我應該能夠以某種方式將它集成到我的腳本中(即使它只是將一些資訊寫入 fifo)!

這應該為您提供所有(好的:大多數。我忘記了什麼?套接字?)文件系統活動,包括寫入:

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 中啟動,則它沒有機會直接喚醒磁碟。對其文件系統層次結構的任何寫入都不會寫入磁碟。

依靠視窗管理器或 X11 通過編寫“真正的”X11 應用程序來處理此問題可能更簡單、更可靠。

你想要從 shell 中註冊的東西是在視窗管理器中註冊並在返回 shell 之前等待所需的事件類型……如果你可以避免在 shell 內循環,它對負載更友好。(您的until xdotool...原因是負載,因為循環內沒有延遲(睡眠)。)

啊…顯然xdotool一年前添加了該功能--sync。這在我目前的 Linux 發行版(Debian Squeeze)中不可用,所以我還沒有嘗試過。

xdotool 開發人員回答了您的類似問題: https ://groups.google.com/d/msg/xdotool-users/7zfKTtyWm0Q/DM6TSOBUWZMJ

引用自:https://unix.stackexchange.com/questions/75023