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)!
strace -f -e trace=file wmctrl -l
harus informatif.fatrace
untuk memeriksa bangun disk, dan itu memberitahu sayabash
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
dariblktrace
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.Jawaban:
Ini harus memberi Anda semua (OK: kebanyakan. Apa yang saya lupa? Soket?) Kegiatan sistem file yang meliputi menulis:
Dengan informasi ini, lingkungan chroot yang berfungsi dapat dibuat dalam tmpfs (sebagai tindakan terakhir; mungkin symlink ke tmpfs sudah cukup). Jika program dimulai dalam chroot RAM maka tidak memiliki kesempatan untuk membangunkan disk secara langsung. Tidak ada tulisan untuk hierarki sistem file yang pernah ditulis ke disk.
sumber
blktrace
akan menjadi alat yang tepat untuk itu, tetapi akan membutuhkan kompilasi kernel# CONFIG_BLK_DEV_IO_TRACE is not set
:( Namun, itu berada di luar cakupan pertanyaan ini. Terima kasih!boot.local
/rc.local
sehingga Anda tidak memiliki akses disk bahkan jika Anda memulai skrip nanti. Saya baru saja melihatblktrace
(tidak tahu itu sebelumnya). Itu sangat mengerikan, saya bertanya-tanya apakah saya akan tidur malam ini ...Mungkin lebih sederhana, dan lebih dapat diandalkan, untuk mengandalkan window manager Anda atau X11 untuk menangani ini dengan menulis aplikasi X11 "nyata".
Apa yang Anda inginkan dari shell adalah sesuatu yang mendaftar dengan manajer jendela dan menunggu jenis acara yang diinginkan sebelum kembali ke shell ... itu jauh lebih ramah beban jika Anda dapat menghindari perulangan di dalam shell. (
until xdotool...
Penyebab Anda dimuat karena tidak ada penundaan (tidur) di dalam loop.)Ah ... ternyata
xdotool
fitur itu ditambahkan lebih dari setahun yang lalu--sync
. Itu tidak tersedia di distro Linux saya saat ini (Debian Squeeze), jadi saya belum mencobanya.Pengembang xdotool menjawab pertanyaan serupa dengan Anda: https://groups.google.com/d/msg/xdotool-users/7zfKTtyWm0Q/DM6TSOBUWZMJ
sumber
-sync
seharusnya melakukan apa yang saya inginkan, tetapi perluwhile
karena itu akhirnya akan crash sebelum jendela muncul, dan buang terlalu banyak CPU. Saya benar-benar dikompilasixdotool
dari sumber karena yang dari Debian sangat lambat untuk mengetik. Menulis aplikasi yang berinteraksi langsung dengan X sebenarnya di luar jangkauan saya. Terimakasih Meskipun!