我有一个像这样的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例如:换句话说 - 我想说mid.ksh在它内部触发的所有进程成功(内部1..4)&amp;&amp; inner4.ksh成功了。
如果inner4.ksh失败 - middle.ksh失败了。
现在我可以收集每个PID并说出wait p1 p2 p3 etc
问题是所有这些子shell都是在包装器(middle.ksh)中动态编写的,所以我不知道有多少inner.ksh会有10个可以100个
可以轻松完成 - 或者我错过了什么。
TY
答案 0 :(得分:1)
这有点令人费解,但是......
{
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
作业。完成这两项工作后,您只需在第一项wait
,然后在第二项wait $last_pid
。如果middle.ksh
是wait
中的最后一个命令,则可以退出; inner*.ksh
的退出状态(即等待的单个middle.ksh
作业的退出状态)将是rc=$?
的退出状态。否则,只需在wait
之后立即放置middle.ksh
,以便在{{1}}退出时保存返回值。