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
我正在寻找"其中一个完成"命令。有吗?
bash
4.3 向内置wait
命令添加了一个-n
标志,这会导致脚本等待下一个子级完成。jobs
-p
选项还意味着您不需要存储 pid 列表,只要没有任何您不想等待的后台作业。
# Run five concurrent processes
for i in {1..5}; do
( longprocess ) &
done
wait -n
kill $(jobs -p)
请注意,如果除了首先完成的 5 个长进程之外还有其他后台作业,则wait -n
将在完成时退出。这也意味着您仍然希望保存要杀死的进程 ID 列表,而不是杀死jobs -p
返回的任何内容。
这实际上相当容易:
#!/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
- 并且您无法知道它来自何处。