有没有办法控制给定bash
会话内的一组作业?
理想情况下,我想说这样的话:
$ prog1 &
$ GROUP=FOO prog2 &
$ GROUP=FOO prog3 &
$ GROUP=BAR prog4 &
然后有例如kill %FOO
仅终止prog2
和prog3
。
答案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 秒)使进程有时间退出并显示错误代码。