linux - 等待后台的所有子进程完成并退出并返回最后一个子进程的代码

标签 linux shell background pid exit-code

我有一个这样的 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_pidmiddle.ksh 中的最后一个命令,您可以简单地退出; wait 的退出状态(这是它等待的单个 inner*.ksh 作业的退出状态)将是 middle.ksh 的退出状态。否则,只需在 wait 之后立即放置 rc=$? 以保存返回值以供稍后 middle.ksh 退出时使用。

关于linux - 等待后台的所有子进程完成并退出并返回最后一个子进程的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21464666/

相关文章:

css - append 模态 : how to fadeIn the background (parent) but not the modal content (child)

android - 重启手机后,后台位置更新是否有可能?

c - "STATUS: Too many open files in system"打开和锁定

python - 使用 Python 从 linux 命令行读取

c - 主要返回后的段错误

linux - 在配置文件中读取最干净/最简单的方法是什么

shell - Docker:在容器中运行的spigot控制台上执行命令

iOS9 Objective-C 使用定时器在后台运行 GPS

shell - 替代 UNIX shell 脚本中的 uuencode(从 UNIX 盒子发送电子邮件)

java - 通过 Maven 为 Node.js 项目运行 "npm install"+ 测试脚本