等待"1 of many process"完成



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 - 并且您无法知道它来自何处。

相关内容

  • 没有找到相关文章

最新更新