【发布时间】:2022-12-16 05:07:59
【问题描述】:
如何在 bash 脚本中等待子进程,如果其中一个返回退出代码 1,那么我想停止所有子进程。
这就是我试图做的。 但是有一些问题:
-
如果第一个进程比所有其他进程都长,并且另一个进程在后台失败......那么脚本等待第一个进程完成,即使另一个进程已经失败。
-
无法检测到 doSomething 失败,因为我将管道用于所需的打印格式。
#!/bin/bash function doSomething() { echo [ $1 start ] sleep $1 if [ $1 == 10 ]; then failed fi echo [ sleep $1 ]: done } function failed(){ sleep 2 echo ------ process failed ------ exit 1 } function process_log() { local NAME=$1 while read Line; do echo [Name ${NAME}]: ${Line} done } pids="" (doSomething 4 | process_log 4)& pids+="$! " (doSomething 17 | process_log 17)& pids+="$! " (doSomething 6 | process_log 6)& pids+="$! " (doSomething 10 | process_log 10)& pids+="$! " (doSomething 22 | process_log 22)& pids+="$! " (doSomething 5 | process_log 5)& pids+="$! " for pid in $pids; do wait $pid || (pkill -P $$ ; break) done echo done program有人有想法吗?
【问题讨论】:
-
不,这不能解决我的问题..谢谢你的帮助! @弗拉瓦多纳
-
事实上 stackoverflow.com/a/71778627/3387716 基本上可以满足您的需求。只需将
exit 1(您不应该在failed函数中包含)替换为对diex函数的调用。 -
它杀死了所有的子进程,也杀死了父进程。我希望父进程中的代码继续运行。在这个例子中,需要打印“完成程序”
-
好吧,您当前的用例不同,所以这不是重复的问题。检查我的答案,看看它现在是否符合您的要求。
-
好吧,您当前的用例不是重复问题。检查我更新的答案。
标签: bash shell process multiprocessing sh