Poczekaj, aż okno X pojawi się / zniknie (w rozsądny sposób)


11

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)!


1
Czy nie ma sensu dowiedzieć się, dlaczego stary kod budzi dysk i szuka rozwiązania? Coś jak chroot i ramdisk. Myślę, że strace -f -e trace=file wmctrl -lpowinien być pouczający.
Hauke ​​Laging

Używam 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?
Teresa e Junior

1
czytanie tych nie obudzi dysku, ponieważ prawdopodobnie zostałyby zapisane w pamięci podręcznej, gdyby były uruchamiane dwa razy na sekundę. Czy zamontowałeś swoje systemy plików z Noatime? Zobacz także btraceod, blktraceaby zbadać źródła aktywności dysku.
Stéphane Chazelas

1
Jeśli jeszcze na to nie spojrzałeś, 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.
msw

1
@msw Usiłuję naprawić nieusuwalny, który jest funkcją automatycznego zapisywania w Google Earth (zamknięte źródła i zgłaszanie błędów to strata czasu)
Teresa e Junior

Odpowiedzi:


4

To powinno dać ci wszystko (OK: większość. Co zapomniałem? Gniazda?) Działania systemu plików, w tym zapisy:

strace -f command 2>&1 | 
  grep -e '^open.*O_CREAT' \
    -e ^write   \
    -e ^mkdir   \
    -e ^rmdir   \
    -e ^unlink  \
    -e ^rename  \
    -e ^chmod   \
    -e ^link    \
    -e ^symlink \
    -e ^mknod

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.


Wierzę, że są chwile, kiedy czytanie pliku, przynajmniej po raz pierwszy, obudzi dysk również, prawda? Zastanawiam się, czy blktracebył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ę!
Teresa e Junior

1
@TeresaeJunior Pewnie, ale kto by pomyślał, że to problem? Chodzi o to, aby skrypt działał cały czas, a nie o jego uruchamianie. I możesz utworzyć tmpfs z boot.local/ rc.localtak, że nie masz dostępu do dysku, nawet jeśli uruchomisz skrypt później. Właśnie obejrzałem blktrace(wcześniej tego nie wiedziałem). To takie okropne, że zastanawiam się, czy pójdę spać tej nocy ...
Hauke ​​Laging

Tak, nie powinienem się już tak martwić, znowu masz rację. Ale myślę, że stracę również tę noc snu przy kompilacji jądra, ponieważ chcę sprawdzić wszystko, co może stale budzić dysk, nie tylko ten konkretny hack Google Earth :)
Teresa e Junior

6

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 xdotoolta 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


Tak, dokładnie, -syncmiałem robić to, co chcę, ale potrzebuje, whileponieważ ostatecznie się zawiesi, zanim pojawi się okno, i marnuje zbyt dużo procesora. Właściwie skompilowałem xdotoolze ź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!
Teresa e Junior
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.