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)!
strace -f -e trace=file wmctrl -l
powinien być pouczający.fatrace
do sprawdzania, czy dyski się nie budzą, a to mówi mi, żebash
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.Odpowiedzi:
To powinno dać ci wszystko (OK: większość. Co zapomniałem? Gniazda?) Działania systemu plików, w tym zapisy:
Dzięki tym informacjom można utworzyć działające środowisko chroot w tmpfs (w ostateczności; być może wystarczą dowiązania symboliczne do tmpfs). Jeśli program zostanie uruchomiony w chroot pamięci RAM, nie będzie szansy na bezpośrednie obudzenie dysku. Żadne zapisy w hierarchii systemu plików nigdy nie są zapisywane na dysk.
źródło
blktrace
byłoby to odpowiednie narzędzie, ale wymagałoby to kompilacji jądra# CONFIG_BLK_DEV_IO_TRACE is not set
:( To jednak nie wchodzi w zakres tego pytania. Dziękuję!boot.local
/rc.local
tak, że nie masz dostępu do dysku, nawet jeśli uruchomisz skrypt później. Właśnie obejrzałemblktrace
(wcześniej tego nie wiedziałem). To takie okropne, że zastanawiam się, czy pójdę spać tej nocy ...Może być łatwiej i bardziej niezawodnie polegać na menedżerze okien lub X11, aby poradzić sobie z tym, pisząc „prawdziwą” aplikację X11.
To, czego oczekujesz od powłoki, to coś, co rejestruje się w menedżerze okien i czeka na pożądany typ zdarzenia przed powrotem do powłoki ... jest znacznie bardziej przyjazne dla obciążenia, jeśli możesz uniknąć zapętlenia się wewnątrz powłoki. (Twoje
until xdotool...
przyczyny są ładowane, ponieważ nie ma opóźnienia (snu) w pętli.)Ach ... najwyraźniej
xdotool
ta funkcja została dodana ponad rok temu--sync
. To nie jest dostępne w mojej obecnej dystrybucji Linuksa (Debian Squeeze), więc go nie wypróbowałem.Deweloper xdotool odpowiada na podobne pytanie: https://groups.google.com/d/msg/xdotool-users/7zfKTtyWm0Q/DM6TSOBUWZMJ
źródło
-sync
miałem robić to, co chcę, ale potrzebuje,while
ponieważ ostatecznie się zawiesi, zanim pojawi się okno, i marnuje zbyt dużo procesora. Właściwie skompilowałemxdotool
ze źródła, ponieważ ten z Debiana był niezwykle powolny w pisaniu. Pisanie aplikacji, która współdziała bezpośrednio z X, jest poza mną. W każdym razie dzięki!