Dentro de un script de shell, necesito esperar a que aparezca una ventana que tenga una cadena en su título, realizar alguna acción, y luego esperar a que desaparezca, y realizar alguna otra acción.
Hasta ayer, tenía este código simple. El problema con esto es que el disco no se puede poner en un estado de ahorro de energía mientras el script se deja en ejecución, y puede durar muchas horas:
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
Como decidí que el código mencionado estaba volviendo loco el disco, revisé la documentación de algunas herramientas de línea de comandos y decidí xdotool
esperar a que apareciera la ventana y xprop
averiguar cuándo desapareció la ventana:
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
Ahora tengo dos nuevos problemas con el código anterior:
xdotool
no solo se bloquea y da resultados extraños, como ya lo he solucionado anteriormente, sino que también absorbe aproximadamente el 15% de la CPU mientras se espera que aparezca la ventana. Eso significa que me deshice del código simple que activa el disco, para escribir el código que queda desperdiciando la CPU durante horas, y mi intención era ahorrar energía en primer lugar.xprop -spy
me notificará cada vez que cambie el foco (que he solucionado$_line
) o crear y destruir ventanas. Eso activa el disco con más frecuencia que xdotool.
Estoy buscando un programa simple que solo espere $string
a que aparezca o desaparezca la ventana con el título . Puede ser una herramienta de línea de comandos existente, un script de Python, un código C compilable ... ¡pero debería poder integrarlo de alguna manera en mi script (incluso si solo escribe alguna información en un quince)!
fatrace
para verificar las reactivaciones del disco, y me dice bash
lecturas /bin/sleep
y /usr/bin/wmctrl
cada medio segundo, es por eso que estoy buscando algún programa que realmente espere los eventos de la ventana. ¿Me estoy perdiendo de algo?
btrace
desde blktrace
para investigar las fuentes de actividad del disco.
xwininfo
podría ser útil, ciertamente carga muchas menos bibliotecas compartidas que wmctrl y opera en un nivel más cercano a la X.
strace -f -e trace=file wmctrl -l
debería ser informativo.