Di dalam skrip shell, saya harus menunggu jendela yang memiliki string pada judulnya muncul, melakukan beberapa tindakan, dan kemudian menunggu itu menghilang, dan melakukan beberapa tindakan lainnya.
Sampai kemarin, saya punya kode sederhana ini. Masalahnya adalah bahwa disk tidak dapat diletakkan dalam keadaan hemat daya saat skrip dibiarkan berjalan, dan bisa berjam-jam:
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
Karena saya memutuskan kode yang disebutkan itu adalah membangunkan disk, saya pergi melalui dokumentasi beberapa alat baris perintah, dan memutuskan xdotool
untuk menunggu jendela muncul, dan xprop
untuk mencari tahu kapan jendela telah hilang:
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
Sekarang saya memiliki dua masalah baru dengan kode di atas:
xdotool
tidak hanya crash dan memberikan hasil yang aneh, seperti yang saya lakukan sebelumnya, tetapi juga menyedot sekitar 15% dari CPU sambil menunggu jendela muncul. Jadi itu berarti saya menyingkirkan kode sederhana yang membangunkan disk, untuk menulis kode yang diboroskan CPU selama berjam-jam, dan niat saya adalah menghemat daya di tempat pertama.xprop -spy
akan memberi tahu saya setiap kali saya mengubah fokus (yang telah saya selesaikan$_line
) atau membuat dan menghancurkan jendela. Itu membangunkan disk lebih sering daripada xdotool.
Saya mencari program sederhana yang hanya menunggu jendela dengan judul $string
muncul atau menghilang. Ini bisa menjadi alat baris perintah yang ada, skrip python, kode C yang dapat dikompilasi ..., tapi saya harus dapat mengintegrasikannya entah bagaimana ke skrip saya (bahkan jika itu hanya menulis beberapa informasi ke fifo)!
fatrace
untuk memeriksa bangun disk, dan itu memberitahu saya bash
membaca /bin/sleep
dan /usr/bin/wmctrl
setiap setengah detik, itu sebabnya saya mencari beberapa program yang benar-benar akan menunggu acara jendela. Apakah saya melewatkan sesuatu?
btrace
dari blktrace
untuk menyelidiki sumber aktivitas disk.
xwininfo
mungkin masih bisa digunakan, itu tentu memuat jauh lebih sedikit perpustakaan bersama daripada wmctrl dan beroperasi pada tingkat yang lebih dekat ke bare X.
strace -f -e trace=file wmctrl -l
harus informatif.