等待“许多过程中的1”完成

时间:2016-06-03 17:54:47

标签: bash wait

bash中是否有任何内置功能可以等待许多进程中的1个完成?然后杀死剩余的进程?

pids=""
# Run five concurrent processes
for i in {1..5}; do
        ( longprocess ) &
        # store PID of process
        pids+=" $!"
done

if [ "one of them finished" ]; then
        kill_rest_of_them;
fi

我正在寻找“其中一个完成”的命令。有没有?

2 个答案:

答案 0 :(得分:6)

bash 4.3在内置-n命令中添加了wait标志,这会导致脚本等待下一个孩子完成。 -p的{​​{1}}选项也意味着您可能不需要存储不需要存储图片列表,只要没有任何后台作业,您想要等待。

jobs

请注意,如果除了首先完成的5个长进程之外还有其他后台作业,# Run five concurrent processes for i in {1..5}; do ( longprocess ) & done wait -n kill $(jobs -p) 将在完成后退出。这也意味着你仍然希望保存进程ID列表来杀死,而不是杀死任何wait -n返回。

答案 1 :(得分:4)

实际上相当容易:

#!/bin/bash
set -o monitor
killAll()
{
# code to kill all child processes
}

# call function to kill all children on SIGCHLD from the first one
trap killAll SIGCHLD

# start your child processes here

# now wait for them to finish
wait

您必须在脚本中非常小心,才能使用bash内置命令。在发出trap命令后,您无法启动作为单独进程运行的任何实用程序 - 任何退出的子进程都将发送SIGCHLD - 您无法分辨它来自。