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
我正在寻找“其中一个完成”的命令。有没有?
答案 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
- 您无法分辨它来自。