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)!
strace -f -e trace=file wmctrl -l
debería ser informativo.fatrace
para verificar las reactivaciones del disco, y me dicebash
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
desdeblktrace
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.Respuestas:
Esto debería darle a todos (OK: la mayoría. ¿Qué he olvidado? ¿Sockets?) Actividades del sistema de archivos que incluyen escrituras:
Con esta información, se puede crear un entorno chroot de trabajo en tmpfs (como acción de último recurso; tal vez los enlaces simbólicos a tmpfs sean suficientes). Si el programa se inicia en un chroot RAM, entonces no tiene la posibilidad de activar el disco directamente. Nunca se escribe en el disco la jerarquía de su sistema de archivos.
fuente
blktrace
sería la herramienta adecuada para eso, pero requeriría una compilación del núcleo# CONFIG_BLK_DEV_IO_TRACE is not set
:( Sin embargo, eso está fuera del alcance de esta pregunta. ¡Gracias!boot.local
/rc.local
para que no tenga acceso al disco, incluso si inicia el script más tarde. Acabo de echar un vistazoblktrace
(no lo sabía antes). Eso es tan terrible que me pregunto si voy a dormir esta noche ...Puede ser más simple y más confiable confiar en su administrador de ventanas o X11 para manejar esto escribiendo una aplicación X11 "real".
Lo que desea del shell es algo que se registra con el administrador de ventanas y espera el tipo de evento deseado antes de regresar al shell ... es mucho más fácil de cargar si puede evitar bucles dentro del shell. (Sus
until xdotool...
causas se cargan porque no hay retraso (suspensión) dentro del bucle).Ah ... aparentemente
xdotool
esa característica se agregó hace más de un año--sync
. Eso no está disponible en mi distribución actual de Linux (Debian Squeeze), por lo que no lo he probado.El desarrollador de xdotool responde una pregunta similar a la suya: https://groups.google.com/d/msg/xdotool-users/7zfKTtyWm0Q/DM6TSOBUWZMJ
fuente
-sync
se suponía que debía hacer lo que quiero, pero lo necesitawhile
porque eventualmente se bloqueará antes de que aparezca la ventana y desperdicie demasiada CPU. Realmente compiléxdotool
desde el código fuente porque el de Debian fue increíblemente lento para escribir. Escribir una aplicación que interactúa directamente con X realmente está más allá de mí. Gracias, sin embargo!