我有一个这样的 shell
middle.ksh <parameter>
inner1.ksh <para> > Log 2>&1 &
p1=$!
inner2.ksh <para> > log 2>&1 &
p2=$!
inner3.ksh <para> > log 2>&1 &
p2=$!
sleep nnn
inner4.ksh <para> > log 2>&1 & /# L1last process fired
p2=$!
rc=$? /# I am checking the rc for the last process
wait
我想做这样的事情
--查明是否所有在后台触发的进程都已完成。
——当所有的都完成后,我希望 middle.ksh 以最后一个子进程的返回码退出——即上面的 inner4.ksh,例如换句话说 - 我想说 middle.ksh 运行良好,如果它在其内部触发的所有进程都成功( inner 1..4)&& inner4.ksh 成功。
如果 inner4.ksh 失败 - middle.ksh 失败。
现在我可以收集每个 PID 并说 wait p1 p2 p3 etc
问题是所有这些子 shell 都是在包装器 (middle.ksh) 中动态编写的,所以我不知道会有多少 inner.ksh 可以是 10 - 可以是 100
它可以很容易地完成吗?或者我错过了什么。
型
最佳答案
有点复杂,但是...
{
inner1.ksh ... &
inner2.ksh ... &
# and all the rest but one of the inner*.ksh jobs
wait
} &
all_but_one_pid=$!
innerN.ksh ... &
last_pid=$!
wait $all_but_one_pid
wait $last_pid
middle.ksh
有两个进程:一个并行运行除一个 inner*.ksh
作业之外的所有作业并在它们全部完成时退出,第二个它运行最后一个 inner*.ksh
作业。一旦这两项工作完成,您只需在第一个上等待
,然后在第二个上等待
。如果 wait $last_pid
是 middle.ksh
中的最后一个命令,您可以简单地退出; wait
的退出状态(这是它等待的单个 inner*.ksh
作业的退出状态)将是 middle.ksh 的退出状态
。否则,只需在 wait
之后立即放置 rc=$?
以保存返回值以供稍后 middle.ksh
退出时使用。
关于linux - 等待后台的所有子进程完成并退出并返回最后一个子进程的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21464666/