gpt4 book ai didi

bash - 使用 set -e 在 bash 中等待多个进程

转载 作者:行者123 更新时间:2023-12-02 03:29:32 25 4
gpt4 key购买 nike

我有一个 bash 脚本,我想在其中并行运行两个进程,如果其中一个进程返回非零值,脚本就会失败。我最初尝试的一个最小例子是:

#!/bin/bash

set -e
(sleep 3 ; true ) &
(sleep 4 ; false ) &
wait %1 && wait %2
echo "Still here, exit code: $?"

正如预期的那样,这不会打印消息,因为 wait %1 && wait %2 失败并且脚本由于 set -e 退出。但是,如果 wait 被反转,使得第一个具有非零状态(wait %2 && wait %1),消息 打印:

$ bash wait_test.sh
Still here, exit code: 1

将每个 wait 放在它自己的行上按我想要的方式工作,如果其中一个进程失败则退出脚本,但事实上它不适用于 &&让我怀疑我在这里误解了什么。

谁能解释一下这是怎么回事?

最佳答案

您可以使用 GNU Parallel 及其“失败处理”非常优雅地实现您想要的。

一般来说,它会并行运行与您拥有的 CPU 内核一样多的作业。

在你的情况下,试试这个,上面写着“如果一个或多个作业失败则以失败状态退出”:

#!/bin/bash

cat <<EOF | parallel --halt soon,fail=1
echo Job 1; exit 0
echo Job 2; exit 1
EOF
echo GNU Parallel exit status: $?

示例输出

Job 1
Job 2
parallel: This job failed:
echo Job 2; exit 1
GNU Parallel exit status: 1

现在运行它使得没有作业失败:

#!/bin/bash

cat <<EOF | parallel --halt soon,fail=1
echo Job 1; exit 0
echo Job 2; exit 0
EOF
echo GNU Parallel exit status: $?

示例输出

Job 1
Job 2
GNU Parallel exit status: 0

如果您不喜欢 heredoc 语法,您可以将作业列表放在一个名为 jobs.txt 的文件中,如下所示:

echo Job 1; exit 0
echo Job 2; exit 0

然后运行:

parallel --halt soon,fail=1 < jobs.txt

关于bash - 使用 set -e 在 bash 中等待多个进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52200324/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com