多くのバックグラウンドコマンドを実行するスクリプトを作成しようとしています。各バックグラウンドコマンドに対して戻りコードを取得する必要があります。
私は次のスクリプトを試しました。
#!/bin/bash
set -x
pid=()
return=()
for i in 1 2
do
echo start $i
ssh mysql "/root/test$i.sh" &
pid[$i]=$!
done
for i in ${#pid[@]}
do
echo ${pid[$i]}
wait ${pid[$i]}
return[$i]=$?
if [ ${return[$i]} -ne 0 ]
then
echo mail error
fi
done
echo ${return[1]}
echo ${return[2]}
私の問題は、待機ループ中に2番目のPIDが最初のPIDの前に完了すると、戻りコードを取得できないことです。
wait pid1 pid2を実行できることを知っていますが、このコマンドを使用するすべてのコマンドの戻りコードを取得することはできません。
どんなアイデアがありますか?
ベストアンサー1
問題はもっとあなたのものです
for i in ${#pid[@]}
これはfor i in 2
。
それが必要です:
for i in 1 2
または
for ((i = 1; i <= ${#pid[@]}; i++))
wait "$pid"
〜するbash
zsh
ジョブのwait
開始時に終了した場合でもジョブの終了コードを返すには(およびPOSIXシェルを使用しますが)を使用します。