Processo em segundo plano levantando informações da janela com algum atraso, como gerenciá-lo?

1

Se eu executar esses comandos:

...
geany --new-instance --no-msgwin --no-session --no-terminal -c pathtoconfig/ &
pid=$!
echo $pid
wmctrl -lp
read -p "waiting..."
...

o PID resultante não corresponde ao do processo geany lançado. Mas se um comando sleep 1 for inserido antes de ler o PID (após a linha geany ), o PID está correto. A razão para isso é que o uso de janelas demora algum tempo, portanto wmctrl -lp fornece informações preliminares que não são exatamente o PID correto. Qual seria a melhor maneira de esperar que geany concluísse o lançamento antes que a nova janela se estabilizasse e wmctrl esteja ciente disso?

Atualização: - Execute no Lubuntu 16.04 / HP ProBook 6360b.

  • O PID real para comparação foi obtido com wmctrl -lp que inclui o PID na lista.

  • O PID é buscado corretamente por $! , o que leva algum tempo para atualizar é aquele fornecido por wmctrl -lp , que é diferente depois de algum tempo (uns 0,27s para geany , uns 0,16s para leafpad ), como se o gerenciador de janelas levasse algum tempo para atualizar o PID.

por nightcod3r 22.07.2017 / 22:50

1 resposta

1

xdotool search --sync --pid "$PID" fará exatamente o que você deseja. Eu encontrei este método aqui

--sync - Block until there are results. This is useful when you are launching an application and want to wait until the application window is visible.

Modelo:

#!/bin/bash

geany &
PID=$!

if xdotool search --sync --pid "$PID" > /dev/null; then
     # if window with the specific PID has appeared
     # then doing something here
fi

Nota:

Não funciona com alguns aplicativos, Netbeans por exemplo, por causa disso:

--pid PID - Match windows that belong to a specific process id. This may not work for some X applications that do not set this metadata on its windows.

Se alterar --pid "$PID" para --name netbeans ou --class netbeans , também funciona.

Exemplo de trabalho:

Este script calcula o atraso em milissegundos, entre o lançamento de geany & e a janela do geany.

#!/bin/bash

geany &
PID=$!
time_start=$(date '+%s%3N')
if xdotool search --sync --pid "$PID" > /dev/null; then
    time_end=$(date '+%s%3N')
    time_interval=$((time_end - time_start))
    printf "%'d ms\n" "$time_interval"
fi

Saída:

$ ./delay_calculate.sh 
553 ms
    
por 24.07.2017 / 23:29