W skrypcie powłoki muszę poczekać, aż pojawi się okno z ciągiem znaków w tytule, wykonać jakąś akcję, a następnie poczekać, aż zniknie i wykonać inną akcję.
Do wczoraj miałem ten prosty kod. Problem polega na tym, że nie można ustawić dysku w stan oszczędzania energii, gdy skrypt jest uruchomiony, i może trwać wiele godzin:
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
Ponieważ zdecydowałem, że wspomniany kod niesamowicie budzi dysk, przejrzałem dokumentację kilku narzędzi wiersza poleceń i postanowiłem xdotool
zaczekać na pojawienie się okna i xprop
dowiedzieć się, kiedy okno zniknęło:
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
Teraz mam dwa nowe problemy z powyższym kodem:
xdotool
nie tylko powoduje awarie i daje dziwne wyniki, jak wcześniej obejrzałem, ale także zasysa około 15% procesora podczas oczekiwania na pojawienie się okna. Oznacza to, że pozbyłem się prostego kodu, który budzi dysk, aby napisać kod, który marnuje procesor na wiele godzin, a moim zamiarem było przede wszystkim oszczędzanie energii.xprop -spy
powiadomi mnie za każdym razem, gdy zmienię fokus (przez co obejrzałem$_line
) lub utworzę i zniszczę okna. To budzi dysk częściej niż xdotool.
Szukam prostego programu, który po prostu czeka, aż okno z tytułem $string
pojawi się lub zniknie. Może to być istniejące narzędzie wiersza poleceń, skrypt Pythona, kompilowalny kod C ... ale powinienem być w stanie jakoś zintegrować go z moim skryptem (nawet jeśli po prostu zapisuje jakieś informacje do fifo)!
fatrace
do sprawdzania, czy dyski się nie budzą, a to mówi mi, że bash
czyta /bin/sleep
i /usr/bin/wmctrl
co pół sekundy, dlatego szukam jakiegoś programu, który faktycznie czeka na zdarzenia okna. Czy coś brakuje?
btrace
od, blktrace
aby zbadać źródła aktywności dysku.
xwininfo
może się przydać, z pewnością ładuje znacznie mniej bibliotek współdzielonych niż wmctrl i działa na poziomie bliższym gołemu X.
strace -f -e trace=file wmctrl -l
powinien być pouczający.