是否有比以下更紧凑的杀死后台作业的形式:
for i in {1..5}; do kill %$i; done
另外,{1..5} 显然有一个硬编码的幻数,我怎样才能使它成为“N”,其中 N 是正确的数字,而不执行以下操作:
$(jobs | wc -l)
我实际上在 PS1 中使用 \j 来获取托管作业的数量,这等效吗?
答案1
对于kill
由 管理的所有后台作业bash
,执行
kill $(jobs -p)
请注意,由于 和 都内置于 中,因此jobs
您kill
不bash
应该遇到任何错误参数列表太长类型。
答案2
使用xargs
而不是$(jobs -p)
子命令,因为如果jobs -p
为空则kill命令将失败。
jobs -p | xargs kill
答案3
我想根据输出的不同jobs -p
,解决方案可能会略有不同。就我而言
$ jobs -p
[1] - 96029 running some job
[2] + 96111 running some other job
因此,这样做是没有好处的。
$ jobs -p | xargs kill
kill: illegal process id: [1]
另一方面,运行kill $(jobs -p)
确实有效,但会带来很多错误消息,因为非 PID 字符串也会被传递到kill
。
因此,我的解决方案是grep
先获取PID再使用xargs
,如下:
$ jobs -p | grep -o -E '\s\d+\s' | xargs kill
答案4
我更喜欢在杀死它们之前检查是否存在任何作业 - 这样,如果没有任何运行,脚本就不会失败。
打字也更短。把这个扔进你的.bash_profile
:
function killjobs () {
JOBS="$(jobs -p)";
if [ -n "${JOBS}" ]; then;
kill -KILL ${JOBS};
fi
}
然后运行:
killjobs
杀死任何正在运行的作业。