以组为单位控制 bash 作业?

以组为单位控制 bash 作业?

有没有办法控制给定bash会话内的一组作业?

理想情况下,我想说这样的话:

$ prog1 &   
$ GROUP=FOO prog2 &
$ GROUP=FOO prog3 &
$ GROUP=BAR prog4 &

然后有例如kill %FOO仅终止prog2prog3

答案1

有没有办法控制给定 bash 会话内的一组作业?

是的!——使用数组形成组,并使用捕获每个进程 ID$!并将其附加到数组。

$!POSIX 指定的特殊参数,它给出最近的后台命令的十进制进程 ID。

下面是有关如何在 Bash 中附加到数组并根据问题内容枚举它们的教程:

首先声明数组:

$ GROUP_FOO=()
$ GROUP_BAR=()

不属于群组的作业:

$ prog1 &

进入 FOO 组的作业(该+=符号表示应将值附加到数组):

$ prog2 &
$ GROUP_FOO+=($!)

FOO 组中还有一项工作:

$ prog3 &
$ GROUP_FOO+=($!)

进入 BAR 小组的工作:

$ prog4 &
$ GROUP_BAR+=($!)

要终止 FOO 组进程:

$ for id in ${GROUP_FOO[@]}; do kill $id; done

脚本版本

如果我正在编写这个脚本,我会稍微修改一下,以便只有在成功启动时才将进程 ID 添加到数组中:

prog2 & sleep 0.1; kill -0 $! && GROUP_FOO+=($!)

这样,您数组中出现进程 ID 不运行的情况就不太可能,因为它们会立即因错误而退出。0.1 秒的休眠延迟(甚至可能是 0.01 秒)使进程有时间退出并显示错误代码。

相关内容