私は多くの部分で構成された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