在CI设置中,我想在后台运行多个作业,并使用v
退出第一个错误。
这需要使用set -e
而不是wait -n
,但为了提高吞吐量,我们希望将wait
移到脚本的末尾。
不幸的是,这意味着很难跟踪错误。
相反,我想要的是经常做与非阻塞for i in {1..20}; do wait -n; done
相同的操作,并尽快退出。
这是可能的还是我必须将我的bash脚本编写为wait -n
?
答案 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