set -e有多个子shell。非阻塞等待-n

时间:2018-03-13 06:46:13

标签: bash

在CI设置中,我想在后台运行多个作业,并使用v退出第一个错误。

这需要使用set -e而不是wait -n,但为了提高吞吐量,我们希望将wait移到脚本的末尾。

不幸的是,这意味着很难跟踪错误。

相反,我想要的是经常做与非阻塞for i in {1..20}; do wait -n; done相同的操作,并尽快退出。

这是可能的还是我必须将我的bash脚本编写为wait -n

1 个答案:

答案 0 :(得分:3)

替代方法:为后台作业模拟set -e

不是一直检查作业,而是在作业失败时直接退出脚本更容易,更有效。为此,请将... || kill $$附加到您开始的每项工作中:

# before
myCommand &
myProgram arg1 arg2 &

# after
myCommand || kill $$ &
myProgram arg1 arg2 || kill $$ &

非阻止wait -n

如果你真的需要,你可以用一个小技巧编写自己的非阻塞wait -n

nextJobExitCode() {
    sleep 0.1 &
    wait -n
    exitCode="$?"
    kill %%
    return "$exitCode"
}

函数nextJobExitCode最多等待0.1秒。如果您的作业都没有完成或者在0.1秒内完成,nextJobExitCode将以退出代码0终止。

使用示例

set -e

sleep 1 &            # job 1
(sleep 3; false) &   # job 2

nextJobExitCode      # won't exit. No jobs finished yet
sleep 2
nextJobExitCode      # won't exit. Job 1 finished with 0
sleep 2
nextJobExitCode      # will exit! Job 2 finished with 1