2012-03-27 24 views

答えて

0

あなたは、プロセスIDを知っている場合は、bashの組み込みであるwaitコマンドを利用することができます:

wait PID 

あなたは$!を使用してbashで実行する最後のコマンドのPIDを取得することができます。または、psの出力からgrepすることができます。

実際、waitコマンドは、bashでparralelコマンドを実行するのに便利な方法です。ここでは例です:

# Start the processes in parallel... 
./script1.sh 1>/dev/null 2>&1 & 
pid1=$! 
./script2.sh 1>/dev/null 2>&1 & 
pid2=$! 
./script3.sh 1>/dev/null 2>&1 & 
pid3=$! 
./script4.sh 1>/dev/null 2>&1 & 
pid4=$! 

# Wait for processes to finish... 
echo -ne "Commands sent... " 
wait $pid1 
err1=$? 
wait $pid2 
err2=$? 
wait $pid3 
err3=$? 
wait $pid4 
err4=$? 

# Do something useful with the return codes... 
if [ $err1 -eq 0 -a $err2 -eq 0 -a $err3 -eq 0 -a $err4 -eq 0 ] 
then 
    echo "pass" 
else 
    echo "fail" 
fi 
+8

はい。しかし、そのpidがあなたの子供の一人である場合にのみ、pidの終了コードを待つことができるということを付け加えたいと思っていました。 –

+0

ああ、ありがとう@賛同者のキュー、私はそれを知らなかった。 –

+1

これは元のプロセスが呼び出されたシェルでのみ機能します。任意のプロセスではありません。 –

3

は、私はPIDが完了するまで待ち、その終了コードを取得することができます方法はあり

はい、プロセスが他の誰かによってptrace Dされていない場合は、あなたをそれにはPTRACE_ATTACHがあり、さまざまなイベント(受信された信号など)とその終了に関する通知が届きます。

注意してください。これは正しく処理するには非常に複雑です。

+0

これは任意のプロセスで動作しますか? from http://linux.die.net/man/2/ptrace - ptrace()システムコールは、** parent **プロセスが別のプロセスの実行を監視し、制御する手段を提供します。 – user1296013

+0

@ user1296013はい、権限を持っている任意のプロセス(すでにptracedされていないプロセス)で動作します(例えば、killすることができれば)。 'ptrace(PTRACE_ATTACH、..)'を実行すると、親になります。 –

+0

@EmployedRussianこれは実際に[Greg's Wiki](http://mywiki.wooledge.org/ProcessManagement)に追加する必要があります。 – l0b0

6

信号とシステムコールを追跡するstraceを使用できます。あまりに印刷取得^Zfgkill -USR1から

$ strace -e none -e exit_group -p $PID  # process calls exit(1) 
Process 23541 attached - interrupt to quit 
exit_group(1)       = ? 
Process 23541 detached 

$ strace -e none -e exit_group -p $PID  # ^C at the keyboard 
Process 22979 attached - interrupt to quit 
--- SIGINT (Interrupt) @ 0 (0) --- 
Process 22979 detached 

$ strace -e none -e exit_group -p $PID  # kill -9 $PID 
Process 22983 attached - interrupt to quit 
+++ killed by SIGKILL +++ 

シグナル:プログラムが完了するまで、次のコマンドを待ち、その終了コードを印刷します。いずれにしても、シェルスクリプトで終了コードを使用する場合は、sedを使用する必要があります。

シェルコードが多すぎる場合は、しばらく前にprogram I hacked together in Cを使用できます。それはptrace()を使用して信号を捕捉し、pidのコードを終了します。 (荒いエッジがあり、すべての状況で機能しない可能性があります)

私は助けてくれることを願っています!

関連する問題