プロセスが終了するまでブロックされるため、使用したくありませんwait
。現在のプロセスが完了するまでステータスの更新を取得できないため、待機するプロセスが複数ある場合は理想的ではありません。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() {
local desc=$1
local 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!