次のコマンドを実行すると:
...
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