2012-03-02 21 views
5

私はいくつかのバックグラウンドプロセスを生成するbashスクリプトを作成しています。私はプロセスが終了するたびに通知を受けたいと思います。私は終了したプロセスのpidを知りたいと思います。bashのトラップを使って終了したバックグラウンドプロセスのPIDをキャプチャします。

私はwaitを使用して見ました。つまり、生成された各プロセスのPIDがキャプチャされ、配列に格納され、次に配列が反復され、各プロセスでwaitが呼び出されます。この技術は、ここでは、さまざまな方法で記述されている:私はそれを正しく理解すれば

https://stackoverflow.com/a/356154/366856

これに伴う問題、あなたは個々のプロセスが終了するとすぐにいくつかのアクションを実行したい場合、それは比較的非効率的にできることです。たとえば、プロセスAとBを生成し、BがAの前に終了する場合、実行はAとBの両方が終了するまで待つ必要があります。私はBが終わるとすぐに行動を起こす必要があります。

trap SIGCHLDは、子が終了したときにすぐにアクションを実行する方法だと思われますが、問題は、SIGCHLD信号のソースのpidを判別する方法が見つからないということです。私はここでは便宜上、それをコピー&ペーストしまし

http://www.linuxforums.org/forum/programming-scripting/103996-multithreading-bash.html#post510187

:私はこれの実施例に見つけた最も近いものは、この記事では3番目のコード例である

#!/bin/bash 

iNext=0 

function ChildReturned() { 
     wait $1 
     echo "$1 was returned. Its exits status was: $?" 
     iNext=$((iNext+1)) 
     StartChild $iNext 
} 


function StartChild { 
     ./child $1 & 
     pid=$! 
     echo "Started: $1 PID= $pid" 
     trap 'ChildReturned $pid' SIGCHLD 
} 


set -bm 

for ((iNext=0; iNext<=10; iNext++)); 
do 
     StartChild $iNext 
done 

wait 

I著者がtrapの引数で異なるpid変数を取り込むたびに、trapを何度も呼び出すこと間違いを犯すので、この例はうまくいかないと思います。トラップが呼び出されるたびに、それは前の呼び出しを上書きし、したがって任意のPIDが捕捉されます。私はより良い技術を見つけることができませんでした。

bashのトラップを使って終了した子プロセスのPIDを取得する方法はありますか?

更新

私はちょうど私がこれまで見てきたこの問題の解決策の最高の、最も包括的な概観が含まれ、このリソースを指すように望んでいた:

http://mywiki.wooledge.org/ProcessManagement#I_want_to_process_a_bunch_of_files_in_parallel.2C_and_when_one_finishes.2C_I_want_to_start_the_next._And_I_want_to_make_sure_there_are_exactly_5_jobs_running_at_a_timeを。

+2

http://mywiki.wooledge.org/ProcessManagement – jordanm

+0

'kill -0 $ PID':非常に便利です!ありがとう! – jbeard4

+0

さらに良いことに、*私は並行してたくさんのファイルを処理したいと思います。そして、ある人が終了すると、私は次のプロセスを開始したいと思います。 *私がこれまでに読んだベスト回答 – jbeard4

答えて

3

トラップを一度設定すると、トラップ内で最後にチェックした後にどの子どもが終了したかを確認するためにjobs -nを呼び出すことができます。これは、どの子がSIGCHLDを送信したかを示すものではありません。あなたがトラップに入る前に2人の子供が死亡するケースを考えてみましょう。その場合、トラップは一度しか入力されません。実際に応答しているのは、子供の信号であることです。 -nはbash拡張機能であり、jobs -lを使用することをお勧めします。

+0

クール、私は 'jobs -n'について知らなかった。私はこれが私の問題をかなりうまく解決するはずだと思うので、私はこの問題を解決してマークするつもりです。 – jbeard4

関連する問題