複数のプロセスは、私ができるように待機する必要がある場合に理想的ではないとします現在のプロセスが完了するまでステータス更新を取得しないでください。私はこれにkill -0
とsleep
の組み合わせを使うのが好きです。
pids
の配列が与えられている場合、私は以下のwaitPids()
関数を使用して、どのpidがまだ終了していないかを継続的にフィードバックします。
declare -a pids
waitPids() {
while [ ${#pids[@]} -ne 0 ]; do
echo "Waiting for pids: ${pids[@]}"
local range=$(eval echo {0..$((${#pids[@]}-1))})
local i
for i in $range; do
if ! kill -0 ${pids[$i]} 2> /dev/null; then
echo "Done -- ${pids[$i]}"
unset pids[$i]
fi
done
pids=("${pids[@]}") # Expunge nulls created by unset.
sleep 1
done
echo "Done!"
}
私はバックグラウンドでプロセスを起動すると、私は効用関数の下にこれを使用してpids
配列にすぐにそのPIDを追加します。ここでは
addPid() {
desc=$1
pid=$2
echo "$desc -- $pid"
pids=(${pids[@]} $pid)
}
は、使用方法を示すサンプルです:
for i in {2..5}; do
sleep $i &
addPid "Sleep for $i" $!
done
waitPids
そして、ここでは、フィードバックがどのように見えるかです:
Sleep for 2 -- 36271
Sleep for 3 -- 36272
Sleep for 4 -- 36273
Sleep for 5 -- 36274
Waiting for pids: 36271 36272 36273 36274
Waiting for pids: 36271 36272 36273 36274
Waiting for pids: 36271 36272 36273 36274
Done -- 36271
Waiting for pids: 36272 36273 36274
Done -- 36272
Waiting for pids: 36273 36274
Done -- 36273
Waiting for pids: 36274
Done -- 36274
Done!
あなたはdo_somethingをmiscapitalizedきた...名前;-) –
はそれを手に入れた - 私は確信して私は午前したいときについて一度に50のインスタンスを実行していますか?そして、それらのプロセスの1つが完了したら、さらに1つが生成されていることを確認してください。 – Greg
'ジョブ' bash組み込み関数を使います。 –