複数のサブシェルをバックグラウンドで実行し全てエラーなく終了したかどうかの確認方法

さてさて、久しぶりのシェルの時間。

スクリプト内でサブシェルを複数バックグラウンドで実行するケースについて。

ご存知の通り、サブシェルをすべてバックグランドで実行した後にwaitコマンドを実行すると
バックグラウンドで走っているシェルが全て終了するまで処理は先に進まない。

チョトマテチョトマテオニーサーン
waitコマンドって何ですのん?

って人はぐぐってください。


話を戻しまして、
全て終了したとしても、予期せぬエラーで中断されていた場合はそれを把握して後続の処理を実施したい場合があると思う。

これについて少しぐぐったところ、それぞれバックグラウンドプロセスで実行したサブシェルの終了ステータスの確認方法は基本的に

サブシェル &  # バックグランドで実行する表記方法
wait $!
echo $?

となっているが、こんな感じのを複数のサブシェルに対して実施し、結果を判定したい。

そんな要望に答えるスクリプトを作ってみた(かなり粗いが

どのサブシェルが失敗したかを見たい場合はこれを参考に発展させていただければと思う。

# judge_from_all_ps_retcode.sh

#!/bin/bash

array=()
array2=()
ERR_FLG=0

for i in $( seq 1 3 ); do
  ./test1.sh > /dev/null 2>&1 &
  array+=($!)
done

for sub_pid in "${array[@]}"; do
  wait ${sub_pid}
  array2+=($?)
done

for ret_code in "${array2[@]}"; do
if [[ ${ret_code} -ne 0 ]]; then
  ERR_FLG=1
fi
done

if [[ ${ERR_FLG} -ne 0 ]]; then
  echo "Sub process failed."
else
  echo "All sub process finished successfully."
fi

exit


上記スクリプトの中で実行しているテスト用スクリプトは以下の通り。ただただ10秒sleepしているだけである。

# test1.sh

#!/bin/bash

echo "sleep 10 seconds"
sleep 10
exit


実行結果

# すべて正常に完了した場合
[vagrant@localhost worktemp]$ sh ./check_all_ps_retcode.sh 
All sub process finished successfully.

#途中でサブシェルtest1.shをkillしたりした場合
[vagrant@localhost worktemp]$ sh ./check_all_ps_retcode.sh 
./check_all_ps_retcode.sh: line 13:  8892 終了しました      ./test1.sh > /dev/null 2>&1
Sub process failed.


※実行時にはtest1.shには実行権限をつけておくこと

チョトマテチョトマテオニーサーン
実行権限ってなんですのん?

って人はぐぐってください。

以上