【问题标题】:How to get the exit status of multiple parallel background processes in bash [duplicate]如何在bash中获取多个并行后台进程的退出状态[重复]
【发布时间】:2018-02-21 21:59:36
【问题描述】:

在 Bash 中,我想并行调用一个命令,同时捕获所有进程的退出代码。

我知道如何启动和等待它们,但等待只会给我最后一个进程退出的退出代码。我还需要寿命较短的进程的退出代码。

不幸的是,我没有 bash 4.3,所以wait -n 不是一个选项,也不是#3004811 中建议的 gnu 并行

#16032001 几乎问了同样的问题,但也没有提供解决方案。

我目前能想到的唯一方法是编写一个帮助脚本,将退出代码存储在一个文件中,但这听起来不是一个干净的解决方案。

【问题讨论】:

  • 这个答案可能有用stackoverflow.com/a/1048390/5291015
  • C 你可以做到这一点。但是您应该注意到,您必须等待所有进程一个接一个地终止。当一个进程退出时,wait家族将它们一一清理。 多个并行进程的退出状态没有意义
  • 我知道我可以在 C 中做到这一点,但我在该服务器上的资源非常有限,并且通常不喜欢弄乱那里的可执行文件(它是 Xen 服务器)。也许我用了不正确的措辞,但我想开始,比如说并行 10 个备份进程,并且需要检查每个进程是否成功。
  • 我明白你说的。我想说的是,没有什么神奇的东西可以得到每个进程的返回值。 see my answer here。没关系;您正在使用 bashc 任何其他人。您必须等待您拥有的任何后台进程。和see this one about wait in bash
  • 我不是一个经验丰富的 Unix c 程序员,但我原则上知道 fork()、wait、SIGCHILD 和僵尸进程如何协同工作。我希望有一种方法可以告诉 bash:“等待下一个后台进程退出并给出退出代码”(也许 wait -n 的作用)。或者将退出代码存储到某个变量中。真正的麻烦是,bash 不会保留僵尸,而是会立即收割它们。所以我必须在子进程退出时运行等待,否则我会错过退出代码...

标签: bash parallel-processing exit


【解决方案1】:

答案在How to wait in bash for several subprocesses to finish and return exit code !=0 when any subprocess ends with code !=0?

我不知道虽然孩子立即被 bash 收割,但内置的等待仍然可以访问 pid 的退出代码。

#!/bin/bash

FAIL=0
PIDS=""

echo "starting"

sleep 5 &
PIDS="$PIDS $!"

sleep 3 &
PIDS="$PIDS $!"

/bin/false &
PIDS="$PIDS $!"

sleep 3 &
PIDS="$PIDS $!"

for job in $PIDS
do
    wait $job || let "FAIL+=1"
    echo $job $FAIL
done

echo $FAIL

if [ "$FAIL" == "0" ];
then
    echo "YAY!"
else
    echo "FAIL! ($FAIL)"
fi

正确给出

starting
14772 0
14773 0
14774 1
14775 1
1
FAIL! (1)

只有第三个进程 (/bin/false) 失败,由第三行从 0 切换到 1 表示。

【讨论】:

  • 当您想要存储项目列表时,请考虑使用数组,而不是字符串。这段代码很脆弱——一旦IFS 更改为不同的值,$PIDS 将不再评估为您的预期列表。
  • (另外,避免在[ ] 中使用==——POSIX 标准不保证test 能够正常工作;唯一强制的字符串比较运算符是=;请参阅pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html )。
  • (另外,请记住,全大写的变量名由 OS 或 shell 的变量使用,而小写的名称保留给应用程序使用,因此保证不会发生冲突;请参阅相关标准 @ pubs.opengroup.org/onlinepubs/9699919799/basedefs/…,第四段)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-23
  • 2020-02-27
  • 1970-01-01
相关资源
最近更新 更多