Bir kabuk betiğinin içinde, başlığında bir dize olan bir pencerenin görünmesini beklemem, bazı eylemler yapmam ve sonra kaybolmasını beklemem ve başka bir eylem yapmam gerekiyor.
Düne kadar bu basit kodu aldım. Buradaki sorun, komut dosyası çalışır durumdayken diskin güç tasarrufu durumuna alınamaması ve saatlerce sürebilmesidir:
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
Bahsedilen kodun diski uyandırdığına karar verdiğim için, birkaç komut satırı aracının belgelerine geçtim xdotool
ve pencerenin görünmesini beklemeye ve pencerenin xprop
ne zaman kaybolduğunu anlamaya karar verdim :
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
Şimdi yukarıdaki kod ile iki yeni sorun var:
xdotool
Daha önce geçici çözüm bulduğum gibi sadece çöküyor ve garip sonuçlar veriyor, aynı zamanda pencerenin görünmesini beklerken CPU'nun yaklaşık% 15'ini emiyor. Yani bu, diski uyandıran basit koddan kurtuldum, CPU'yu saatlerce boşa harcayan kod yazmak için ve niyetim ilk etapta güç tasarrufu yapmaktı.xprop -spy
odağı her değiştirdiğimde (geçici olarak çözdüğüm$_line
) veya pencereleri oluşturup yok ettiğimde beni bilgilendirir . Bu, diski xdotool'den daha sık uyandırır.
Ben sadece başlık $string
görünmesini veya kaybolması ile pencere için bekleyen basit bir program arıyorum . Mevcut bir komut satırı aracı, bir python betiği, derlenebilir C kodu olabilir ..., ama bir şekilde benim betime (sadece bir fifo için bazı bilgiler yazsa bile) entegre edebilmeliyim!
fatrace
Disk uyanmalarını kontrol etmek için kullanıyorum ve bana bash
okumaları /bin/sleep
ve /usr/bin/wmctrl
her yarım saniyede bir, bu yüzden aslında pencere olaylarını bekleyecek bir program arıyorum. Bir şey mi kaçırıyorum?
btrace
gelen blktrace
Disk etkinlik kaynaklarını araştırmak.
xwininfo
wmctrl daha kesinlikle yükleri çok daha az sayıda paylaşılan kütüphaneleri, kullanım olabilir ve daha yakın çıplak X bir seviyede çalışır
strace -f -e trace=file wmctrl -l
bilgilendirici olmalı.