창 정보를 보내는 백그라운드 프로세스에서 약간의 지연이 발생합니다. 어떻게 관리합니까?

창 정보를 보내는 백그라운드 프로세스에서 약간의 지연이 발생합니다. 어떻게 관리합니까?

다음 명령을 실행하면:

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

생성된 PID가 시작된 프로세스의 PID와 일치하지 않습니다 geany. 하지만 sleep 1PID를 읽기 전에( geany이 줄 뒤) 명령을 삽입하면 PID가 올바른 것입니다. 그 이유는 윈도잉에 시간이 걸리기 때문에 wmctrl -lp제공된 예비 정보가 정확한 PID를 정확하게 제공하지 못하기 때문입니다. 새 창이 안정화되고 wmctrl이를 실현하기 전에 geany가 시작될 때까지 기다리는 가장 좋은 방법은 무엇입니까?

업데이트: - Lubuntu 16.04 / HP ProBook 6360b에서 실행됩니다.

  • wmctrl -lp목록에 있는 PID가 포함된 실제 PID와 비교하세요.

  • PID는 에 의해 정확하게 얻어지고 $!업데이트에 시간이 걸리는 것이 제공되며, 마치 창 관리자가 PID를 업데이트하는 데 시간이 걸리는 것처럼 wmctrl -lp일정 시간(약 0.27초 geany, 약 0.16초 ) 후에 달라집니다.leafpad

답변1

xdotool search --sync --pid "$PID"당신이 원하는 것을 정확하게 할 것입니다. 이 방법을 찾았어요여기

- 동기화- 결과가 나올 때까지 차단하세요. 이는 애플리케이션을 실행하고 애플리케이션 창이 표시될 때까지 기다리고 싶을 때 유용합니다.

주형:

#!/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

노트:

Netbeans예를 들어 다음과 같은 이유로 일부 응용 프로그램에는 적합하지 않습니다 .

--pid PID- 특정 프로세스 ID에 속하는 창과 일치합니다. 이는 창에 이 메타데이터를 설정하지 않은 일부 X 응용 프로그램에서는 작동하지 않을 수 있습니다.

또는 --pid "$PID"로 변경해 도 작동합니다 .--name netbeans--class netbeans

실제 사례:

이 스크립트는 geany &시작과 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

산출:

$ ./delay_calculate.sh 
553 ms

관련 정보