bashのバックグラウンドジョブはいつ/いつ終了状態を返しますか?

bashのバックグラウンドジョブはいつ/いつ終了状態を返しますか?

私は多くの部分で構成されたbashスクリプトを書いていますが、復元力と並列処理機能ができるだけ多く組み込まれていることを願っています。例は次のとおりです。

while true
do
  var=$(curl someurl) || continue
  var2=$(curl someurl2) || continue
  var3=$(curl someurl3) || continue
  dosomething var1 || continue
  dosomething2 var2 || continue
  dosomething3 var3 || continue
  break
done

3つのカールコマンドを並列に実行し、3つの「何かタスクを実行する」コマンドも並列に実行したいと思います。しかし、これがどのように処理されるかはよくわかりません。各ブロックの後と各コマンドの後に次のようにwaitコマンドを挿入することを検討しました。&

while true
do
  var=$(curl someurl) & || continue
  var2=$(curl someurl2) & || continue
  var3=$(curl someurl3) & || continue
  wait
  dosomething var1 & || continue
  dosomething2 var2 & || continue
  dosomething3 var3 & || continue
  wait
  break
done

ただし、この場合、終了状態および/または競合状態を管理する方法がわかりません。また、これは最高のコーディング方法ではないようです。これを行うための良い方法はありますか?

ベストアンサー1

Bashを使用すると、バックグラウンドで何かの出力をキャプチャできません。

$ unset var; var=$(sh -c 'sleep 5; echo foo; exit 42') 
$ echo $? $var 
42 foo
$ unset var; var=$(sh -c 'sleep 5; echo foo; exit 42') & wait
[1] 30250
[1]+  Exit 42                 var=$(sh -c 'sleep 5; echo foo; exit 42')
$ echo $? $var 
0 

wait -n返品があるとき一部バックグラウンドプロセスが終了し、プロセスの終了状態で終了しました。バックグラウンドプロセスの数がわかっているので、wait -n何度も実行できます。醜いけど…

while true
do
  curl someurl1 > file1 &
  curl someurl2 > file2 &
  curl someurl3 > file3 &
  for i in 1 2 3; do
    wait -n || { echo some curl failed; continue 2; }
  done

  dosomething "$(< file1)" &
  dosomething "$(< file2)" &
  dosomething "$(< file3)" &
  for i in 1 2 3; do
    wait -n || { echo some dosomething failed; continue 2; }
  done

  break
done

おすすめ記事