我正在编写一个包含许多部分的 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 个curl 命令,然后也并行运行三个“做某事”命令。不过,我不确定这将如何处理。我考虑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