バックグラウンドの子プロセスのPIDは$!に格納されます。。すべての子プロセスのpidを配列に格納できます(例:PIDS [])。
wait [-n] [jobspec or pid …]
各プロセスID pidまたはジョブ仕様jobspecで指定された子プロセスが終了するまで待機し、最後に待機したコマンドの終了ステータスを返します。ジョブ仕様が指定されている場合、ジョブ内のすべてのプロセスが待機されます。引数を指定しないと、現在アクティブなすべての子プロセスが待機し、戻りステータスはゼロになります。-nオプションが指定されている場合、waitはジョブが終了するまで待機し、その終了ステータスを返します。jobspecもpidもシェルのアクティブな子プロセスを指定していない場合、戻りステータスは127です。
すべての子プロセスが終了するのを待つことができるwaitコマンドを使用する一方で、$を介して各子プロセスの終了ステータスを取得できますか?ステータスをSTATUS []に保存します。次に、ステータスに応じて何かを行うことができます。
私は次の2つの解決策を試してみましたが、うまく動作しました。solution01はより簡潔ですが、solution02は少し複雑です。
solution01
#!/bin/bash
# start 3 child processes concurrently, and store each pid into array PIDS[].
process=(a.sh b.sh c.sh)
for app in ${process[@]}; do
./${app} &
PIDS+=($!)
done
# wait for all processes to finish, and store each process's exit code into array STATUS[].
for pid in ${PIDS[@]}; do
echo "pid=${pid}"
wait ${pid}
STATUS+=($?)
done
# after all processed finish, check their exit codes in STATUS[].
i=0
for st in ${STATUS[@]}; do
if [[ ${st} -ne 0 ]]; then
echo "$i failed"
else
echo "$i finish"
fi
((i+=1))
done
solution02
#!/bin/bash
# start 3 child processes concurrently, and store each pid into array PIDS[].
i=0
process=(a.sh b.sh c.sh)
for app in ${process[@]}; do
./${app} &
pid=$!
PIDS[$i]=${pid}
((i+=1))
done
# wait for all processes to finish, and store each process's exit code into array STATUS[].
i=0
for pid in ${PIDS[@]}; do
echo "pid=${pid}"
wait ${pid}
STATUS[$i]=$?
((i+=1))
done
# after all processed finish, check their exit codes in STATUS[].
i=0
for st in ${STATUS[@]}; do
if [[ ${st} -ne 0 ]]; then
echo "$i failed"
else
echo "$i finish"
fi
((i+=1))
done