다음 명령을 실행하면:
...
geany --new-instance --no-msgwin --no-session --no-terminal -c pathtoconfig/ &
pid=$!
echo $pid
wmctrl -lp
read -p "waiting..."
...
생성된 PID가 시작된 프로세스의 PID와 일치하지 않습니다 geany
. 하지만 sleep 1
PID를 읽기 전에( 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