如果子进程失败,则返回非零退出状态

时间:2018-11-22 10:38:52

标签: bash performance docker continuous-integration

我有一个docker build脚本,该脚本构建了一系列库并运行测试服。为了使我的构建脚本在许多核心服务器上更快地运行,我更改了命令的顺序顺序(将传递给RUN的命令转换为对多个并行命令的bash调用:

RUN /bin/bash -c -e '\
    cmd1 arg1 & \
    cmd2 & \
    cmd3 arg1 arg2=foo arg3 & \
    wait'

此工作文件没有错误。然后,我意识到即使子进程之一返回非零退出状态,整个bash命令也会返回0,而docker会继续构建...我如何进行bash调用以返回0 iff它的所有子级都返回0吗?

1 个答案:

答案 0 :(得分:2)

您可以将bash的wait命令用于特定的PID返回其返回状态:

job1 &
job1pid=$!
job2 &
job2pid=$!
job3 &
job3pid=$!
if wait ${job1pid} && wait ${job2pid} && wait ${job3pid}
then
  exit 0
else
  exit 1
fi

测试:

$ cat > childprocess.sh
#!/bin/bash
awk 'BEGIN { exit('$1'); }' &
job1pid=$!
awk 'BEGIN { exit('$2'); }' &
job2pid=$!
awk 'BEGIN { exit('$3'); }' &
job3pid=$!
if wait ${job1pid} && wait ${job2pid} && wait ${job3pid}
then
  exit 0
else
  exit 1
fi

$ ./childprocess.sh 0 0 0
$ echo $?
0
$ ./childprocess.sh 1 1 1
$ echo $?
1
$ ./childprocess.sh 0 1 0
$ echo $?
1

来自GNU bash doc

  

等待[-n] [jobspec或pid…]

     

等待直到每个进程ID pid或作业指定的子进程   规范jobspec退出并返回最后一个的退出状态   命令等待。如果给出了工作说明,则工作中的所有流程   等待着。如果未提供任何参数,则所有当前活动的子级   等待进程,返回状态为零。如果-n   提供了选项,等待任何作业终止并返回   其退出状态。如果jobspec和pid均未指定活动子级   外壳程序的返回状态为127。