Dentro de um script de shell, preciso aguardar a exibição de uma janela com uma string no título, executar alguma ação e esperar que ela desapareça e executar outra ação.
Até ontem, eu tinha esse código simples. O problema é que o disco não pode ser colocado em um estado de economia de energia enquanto o script permanece em execução, e isso pode ocorrer por muitas 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 decidi que o código mencionado estava despertando insanamente o disco, consultei a documentação de algumas ferramentas de linha de comando e decidi xdotool
esperar a janela aparecer e xprop
descobrir quando a janela desapareceu:
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
Agora eu tenho dois novos problemas com o código acima:
xdotool
não apenas trava e dá resultados estranhos, como eu já havia contornado antes, mas também suga cerca de 15% da CPU enquanto aguarda a janela aparecer. Isso significa que me livrei do código simples que ativa o disco, para escrever o código que resta desperdiçando a CPU por horas, e minha intenção era economizar energia em primeiro lugar.xprop -spy
me notificará toda vez que eu mudar o foco (que eu contornei$_line
) ou criar e destruir janelas. Isso ativa o disco com mais frequência que o xdotool.
Estou procurando um programa simples que apenas aguarde a janela com o título $string
aparecer ou desaparecer. Pode ser uma ferramenta de linha de comando existente, um script python, código C compilável ..., mas eu devo ser capaz de integrá-lo de alguma forma ao meu script (mesmo que apenas grave algumas informações em um fifo)!
fatrace
para verificar se há ativações de disco, e isso me diz bash
leituras /bin/sleep
e a /usr/bin/wmctrl
cada meio segundo, é por isso que estou procurando por algum programa que realmente espere eventos da janela. Estou esquecendo de algo?
btrace
from blktrace
para investigar as fontes de atividade do disco.
xwininfo
pode ser útil, certamente cargas muito menos bibliotecas compartilhadas do que wmctrl e opera em um nível mais próximo X. nua
strace -f -e trace=file wmctrl -l
deveria ser informativo.