我有一个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
吗?
答案 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。