![如何检测脚本中启动的所有子进程是否结束?](https://linux22.com/image/73579/%E5%A6%82%E4%BD%95%E6%A3%80%E6%B5%8B%E8%84%9A%E6%9C%AC%E4%B8%AD%E5%90%AF%E5%8A%A8%E7%9A%84%E6%89%80%E6%9C%89%E5%AD%90%E8%BF%9B%E7%A8%8B%E6%98%AF%E5%90%A6%E7%BB%93%E6%9D%9F%EF%BC%9F.png)
我想通过使用循环并行启动多个命令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