等待 X 視窗出現/消失(以理智的方式)
在 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