如何检测脚本中启动的所有子进程是否结束?

如何检测脚本中启动的所有子进程是否结束?

我想通过使用循环并行启动多个命令for,每个命令可能需要或多或少的时间,并且我想在脚本末尾调用另一个命令。这是一个最小的例子:

#!/bin/bash

function test {
    length=$1
    sleep $length

    echo "$length"
    echo "-----"
}

# http://www.cyberciti.biz/faq/bash-for-loop-array/    
array=( 5 1 3 )

for time in "${array[@]}"
do
    test $time &
done

结果如下:

$ bash ~/test.sh && echo "OK"
OK
$ 1
-----
3
-----
5
-----

正如您所看到的,OK在脚本结束之前显示,这是合乎逻辑的,因为我test在后台调用了&.我无法对最后一个test调用添加测试,因为它可以在其他调用之前结束。我希望脚本仅test在后台调用的所有实例结束后退出。

这是我试图获得的结果:

$ bash ~/test.sh && echo "OK"
1
-----
3
-----
5
-----
OK
$ 

我怎样才能得到这个输出?

答案1

你必须等待循环之后for,因此等待所有当前活动的子进程:

for time in "${array[@]}"
do
    test "$time" &
done

wait

相关内容