Зачекайте, коли X-вікно з’явиться / зникне (здоровим чином)


11

Всередині скрипту оболонки мені потрібно дочекатися появи вікна, на якому є рядок із заголовком, виконати якусь дію, а потім дочекатися його зникнення та зробити ще одну дію.

До вчорашнього дня у мене був цей простий код. Проблема в ньому полягає в тому, що диск не може бути переведений в стан економії енергії, поки сценарій не працює, і це може бути протягом багатьох годин:

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

Оскільки я вирішив, що згаданий код шалено розбудив диск, я ознайомився з документацією кількох інструментів командного рядка і вирішив xdotoolпочекати появи вікна та xpropз'ясувати, коли вікно зникне:

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

Тепер у мене є дві нові проблеми з кодом вище:

  • xdotoolне тільки виходить з ладу і дає дивні результати, як я раніше обходив, але це також висмоктує близько 15% процесора, залишаючи очікування появи вікна. Тож це означає, що я позбувся простого коду, який розбуджує диск, писати код, який залишається витрачати процесор годинами, і мій намір в першу чергу економив енергію.
  • xprop -spyбуде повідомляти мене щоразу, коли я зміню фокус (який я обійшов $_line) або створити та знищити вікна. Це прокидає диск частіше, ніж xdotool.

Я шукаю просту програму, яка просто чекає, коли $stringз'явиться або зникне вікно з заголовком . Це може бути існуючий інструмент командного рядка, скрипт python, компільований код C ..., але я маю змогу якось інтегрувати його до мого сценарію (навіть якщо він просто записує якусь інформацію у фіфо)!


1
Чи не було б сенсу з’ясувати, чому ваш старий код будить диск і шукати рішення? Щось на кшталт chroot і ramdisk. Я думаю, strace -f -e trace=file wmctrl -lмає бути інформативним.
Hauke ​​Laging

Я використовую, fatraceщоб перевірити наявність дисків, і він повідомляє мені, що bashчитає, /bin/sleepі /usr/bin/wmctrlкожні пів секунди, тому я шукаю якусь програму, яка насправді чекатиме подій у вікні. Я щось пропускаю?
Teresa e Junior

1
читання тих не прокинеться з диска, так як вони, ймовірно, будуть кешовані, якщо їх запускати двічі щосекунди. Ви монтували файлові системи в режимі часу? Дивіться також btraceвід blktraceдослідити джерела активності диска.
Стефан Шазелас

1
Якщо ви ще не подивилися на це, він xwininfoможе бути корисним, він, безумовно, завантажує набагато менше спільних бібліотек, ніж wmctrl і працює на рівні, ближчому до голого X.
msw

1
@msw Я намагаюся виправити непоправний, який є функцією автоматичного збереження для Google Планета Земля (закриті джерела пошуку та повідомлення про помилки - це марна трата часу)
Teresa e Junior

Відповіді:


4

Це повинно дати вам усі (Добре: більшість. Що я забув? Сокети?) Діяльність файлової системи, яка включає записи:

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

За допомогою цієї інформації в tmpfs може бути створено робоче середовище chroot (як остання дія; можливо, достатньо символьних посилань на tmpfs). Якщо програма запускається в Chroot RAM, то вона не має шансу розбудити диск безпосередньо. Жодне записування в її ієрархію файлової системи ніколи не записується на диск.


Я вважаю, що бувають випадки, коли читання файлу, принаймні вперше, також розбудить диск, чи не так? Мені цікаво, чи blktraceбув би це правильний інструмент для цього, але це потребує компіляції ядра # CONFIG_BLK_DEV_IO_TRACE is not set:( Це виходить за рамки цього питання. Дякую!
Teresa e Junior

1
@TeresaeJunior Звичайно, але хто вважатиме це проблемою? Йдеться про те, щоб сценарій постійно працював, а не про його запуск. І ви можете створити tmpfs з boot.local/ rc.localтак, щоб у вас не було доступу до диска, навіть якщо ви запустите сценарій пізніше. Я просто подивився blktrace(не знав цього раніше). Це так страшно, що мені цікаво, чи спати я сьогодні спатиму ...
Хоуке Лагінг

Так, я більше не повинен про це хвилюватися, ти знову маєш рацію. Але я думаю, що я також втрачу цю ніч сну, компілюючи ядро, оскільки хочу перевірити все, що може постійно пробуджувати диск, не тільки цей конкретний злом Google Earth :)
Teresa e Junior

6

Можливо, буде простіше і надійніше розраховувати на свого менеджера вікон або X11, щоб впоратися з цим, написавши "справжню" програму X11.

Те, що ви хочете від оболонки, - це те, що реєструється у вікні менеджера і чекає потрібного типу події, перш ніж повернутися до оболонки ... це набагато зручніше для завантаження, якщо ви можете уникнути циклічення всередині оболонки. (Ваші until xdotool...причини завантажуються через те, що всередині циклу немає затримки (сну).)

Ага ... мабуть xdotool, ця функція була додана понад рік тому --sync. Це не доступно в моєму поточному дистрибутиві Linux (Debian Squeeze), тому я його не пробував.

Розробник xdotool відповідає на подібне запитання до вашого: https://groups.google.com/d/msg/xdotool-users/7zfKTtyWm0Q/DM6TSOBUWZMJ


Так, саме, я -syncповинен був робити те, що я хочу, але це потрібно, whileтому що воно врешті-решт вийде з ладу до появи вікна і втратить занадто багато процесора. Я насправді компілював xdotoolз джерела, тому що той від Debian був неймовірно повільним. Написання програми, яка взаємодіє безпосередньо з X, насправді поза мною. Дякую, хоча!
Teresa e Junior
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.