Всередині скрипту оболонки мені потрібно дочекатися появи вікна, на якому є рядок із заголовком, виконати якусь дію, а потім дочекатися його зникнення та зробити ще одну дію.
До вчорашнього дня у мене був цей простий код. Проблема в ньому полягає в тому, що диск не може бути переведений в стан економії енергії, поки сценарій не працює, і це може бути протягом багатьох годин:
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 ..., але я маю змогу якось інтегрувати його до мого сценарію (навіть якщо він просто записує якусь інформацію у фіфо)!
fatrace
щоб перевірити наявність дисків, і він повідомляє мені, що bash
читає, /bin/sleep
і /usr/bin/wmctrl
кожні пів секунди, тому я шукаю якусь програму, яка насправді чекатиме подій у вікні. Я щось пропускаю?
btrace
від blktrace
дослідити джерела активності диска.
xwininfo
може бути корисним, він, безумовно, завантажує набагато менше спільних бібліотек, ніж wmctrl і працює на рівні, ближчому до голого X.
strace -f -e trace=file wmctrl -l
має бути інформативним.