bash - 如何等待脚本生成的所有子(和孙子等)进程

标签 bash shell unix process

上下文:

用户向我提供他们要运行的自定义脚本。这些脚本可以是任何类型的,比如启动多个 GUI 程序、后端服务的脚本。我无法控制脚本的编写方式。这些脚本可以是阻塞类型的,即执行等到所有子进程(顺序运行的程序)退出

#exaple of blocking script
echo "START"
first_program 
second_program 
echo "DONE"

或非阻塞类型,即在后台 fork 子进程并退出类似

#example of non-blocking script
echo "START"
first_program &
second_program &
echo "DONE"

我想达到什么目的?

用户提供的脚本可以是上述两种类型中的任何一种,也可以是两者的混合。我的工作是运行脚本并等待它启动的所有进程退出,然后关闭节点。如果它是阻塞类型,情况很简单,即获取脚本执行过程的 PID 并等到 ps -ef|grep -ef PID 没有更多条目。非阻塞脚本给我带来了麻烦

有没有一种方法可以获得通过执行脚本生成的所有子进程的 PID 列表?任何指针或提示将不胜感激

最佳答案

您可以使用wait 来等待所有由userscript 启动的后台进程完成。由于 wait 仅适用于当前 shell 的子级,因此您需要获取它们的脚本而不是将其作为单独的进程运行。

( source userscript; wait )

在显式子 shell 中获取脚本应该足够模拟启动一个新进程。如果没有,您还可以让子 shell 后台运行,这会强制启动一个新进程,然后等待完成。

( source userscript; wait ) & wait

关于bash - 如何等待脚本生成的所有子(和孙子等)进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32382414/

相关文章:

linux - Bash shell 提示我没有使用的无效选项...仅适用于 *.mp4 文件扩展名

linux - ldconfig 注册.so lib

python - 测试 niceness 是否被正确应用

Python:subprocess.call 破管

bash - bash shell 中的 Docker、CentOS : How to automate loading of modules with environment-modules,?

arrays - bash:如何使用一个数组创建另一个数组?

linux - Bash - 在与当前终端分开的另一个终端中启动命令的新实例

bash - 如何使用 bash 持续监控 rhythmbox 的音轨变化

linux - 在 bash 中查找和替换变量

linux - 如何使 zsh `run-help` 忽略 `sudo` 并获得有关以下命令的帮助