2012-07-11 6 views
5

PIDがなくなるまで待つためにBashを使用しています。私はBash:PIDが存在しないまで待機するためにwhileまたはuntilを使用する

#!/bin/bash 
while [ kill -0 PID > /dev/null 2>&1 ]; do 
    //code to kill process 
done 
//code to execute after process is dead 

など

#!/bin/bash 
until [ ! kill -0 PID > /dev/null 2>&1 ]; do 
    //code to kill process 
done 
//code to execute after process is dead 

これらの例が動作しない、またはプロセスが終了した後にループし続ける両方のいずれかを試してみました。私は間違って何をしていますか?

+0

あなただけの "$ PIDを" ''待って使用することはできませんか? –

+0

PIDがシェルの子ではないことを返します。 – hexacyanide

+0

**あなたが見ているプロセスが_子プロセスでない限り、いくつかの落とし穴があります。詳細については、[このコメント](http://stackoverflow.com/questions/1058047/wait-for-any-process-to-finish/1127675#comment24774342_1058047)を参照してください。 –

答えて

15

あなたは単純にやるべきこと:

while kill -0 $PID >/dev/null 2>&1 
do 
    # Code to kill process 
done 

をループ条件は、この場合には、最後のコマンド—の終了ステータスをテストしkill

「最後」の重要性は、あなたが書くことができるということです。

while sleep 1 
     echo Testing again 
     kill -0 $PID >/dev/null 2>&1 
do 
    # Code to kill process 
done 

これはあまりにもkill(単独でkill)の終了ステータスをテストします。

+0

'kill -0'がプロセスをチェックすることを説明するメモを追加する価値があります。それは正確に直感的ではありません... – Nagev

+0

私はそれが明らかではないと思うが、それは問題に使用されたので、OPはそれを説明する必要はありませんでした。 –

4

また、あなたは(マックOSを除くほぼすべて)のprocfsでのUnixで行うことができます

while test -d /proc/$PID; do 
    kill -$SIGNAL $PID 
    # optionally 
    sleep 0.2 
done 
+1

これはMacでは動作しません – Somatik

+0

私はprocfsを持っていないことに気付かなかった。 –

関連する問題