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 xdotool
di attendere che appaia la finestra e xprop
di 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:
xdotool
non 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 -spy
mi 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 $string
che 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)!
fatrace
per verificare la riattivazione del disco, e mi dice bash
letture /bin/sleep
e /usr/bin/wmctrl
ogni mezzo secondo, è per questo che sto cercando un programma che effettivamente aspetterà gli eventi della finestra. Mi sto perdendo qualcosa?
btrace
da blktrace
per esaminare le fonti di attività del disco.
xwininfo
potrebbe 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 -l
dovrebbe essere informativo.