私はいくつかのバックグラウンドプロセスを生成する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 – jordanm
'kill -0 $ PID':非常に便利です!ありがとう! – jbeard4
さらに良いことに、*私は並行してたくさんのファイルを処理したいと思います。そして、ある人が終了すると、私は次のプロセスを開始したいと思います。 *私がこれまでに読んだベスト回答 – jbeard4