代码之家  ›  专栏  ›  技术社区  ›  John

如何在bash脚本中等待子进程,如果其中一个失败,那么停止所有人

  •  0
  • John  · 技术社区  · 3 年前

    如何在bash脚本中等待子进程,如果其中一个返回退出代码1,那么我想停止所有子进程。

    这就是我试图做的。 但也有一些问题:

    1. 如果第一个进程比所有其他进程都长,而另一个进程在后台失败。。。然后,脚本等待第一个进程完成,即使另一个进程已经失败。

    2. 无法检测到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
    

    有人有主意吗?

    0 回复  |  直到 3 年前