All'interno di uno script di shell, devo aspettare che appaia una finestra con una stringa sul titolo, fare qualche azione, quindi aspettare che scompaia e fare qualche altra azione.
Fino a ieri avevo questo semplice codice. Il problema è che il disco non può essere messo in uno stato di risparmio energetico mentre lo script viene lasciato in esecuzione e può durare per molte ore:
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
Da quando ho deciso che il codice citato stava riattivando follemente il disco, ho esaminato la documentazione di alcuni strumenti della riga di comando e ho deciso xdotooldi attendere che appaia la finestra e xpropdi capire quando la finestra è svanita:
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
Ora ho due nuovi problemi con il codice sopra:
xdotoolnon solo si arresta in modo anomalo e dà risultati strani, come ho già aggirato in precedenza, ma succhia anche circa il 15% della CPU mentre rimane in attesa che appaia la finestra. Ciò significa che mi sono sbarazzato del semplice codice che riattiva il disco, di scrivere codice che è rimasto sprecando la CPU per ore e la mia intenzione era di risparmiare energia in primo luogo.xprop -spymi avviserà ogni volta che cambio focus (su cui ho risolto il problema$_line) o creo e distruggo windows. Ciò riattiva il disco più frequentemente di xdotool.
Sto cercando un semplice programma in attesa $stringche appaia o scompaia la finestra con il titolo . Può essere uno strumento a riga di comando esistente, uno script Python, un codice C compilabile ..., ma dovrei essere in grado di integrarlo in qualche modo nel mio script (anche se scrive solo alcune informazioni su un FIFO)!
fatraceper verificare la riattivazione del disco, e mi dice bashletture /bin/sleepe /usr/bin/wmctrlogni mezzo secondo, è per questo che sto cercando un programma che effettivamente aspetterà gli eventi della finestra. Mi sto perdendo qualcosa?
btraceda blktraceper esaminare le fonti di attività del disco.
xwininfopotrebbe essere utile, carica sicuramente molte meno librerie condivise rispetto a wmctrl e funziona a un livello più vicino a X nudo.
strace -f -e trace=file wmctrl -ldovrebbe essere informativo.