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 个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

相关内容