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 xdotoolzaczekać na pojawienie się okna i xpropdowiedzieć 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:
xdotoolnie 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 -spypowiadomi 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 $stringpojawi 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)!
fatracedo sprawdzania, czy dyski się nie budzą, a to mówi mi, że bashczyta /bin/sleepi /usr/bin/wmctrlco pół sekundy, dlatego szukam jakiegoś programu, który faktycznie czeka na zdarzenia okna. Czy coś brakuje?
btraceod, blktraceaby zbadać źródła aktywności dysku.
xwininfomoż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 -lpowinien być pouczający.