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