是否有比以下更紧凑的杀死后台作业的形式:
for i in {1..5}; do kill %$i; done
Run Code Online (Sandbox Code Playgroud)
此外,{1..5} 显然有一个硬编码的幻数,我怎样才能使它成为“N”,而 N 是正确的数字,而不做:
$(jobs | wc -l)
Run Code Online (Sandbox Code Playgroud)
我实际上在 PS1 中使用 \j 来获取托管作业的数量,这是否等效?
jw0*_*013 138
对于kill由 管理的所有后台作业bash,请执行
kill $(jobs -p)
Run Code Online (Sandbox Code Playgroud)
请注意,由于jobs和kill都内置于 中bash,因此您不应遇到Argument 列表太长类型的任何错误。
小智 25
使用xargs代替$(jobs -p)子命令,因为如果jobs -p为空,则 kill 命令将失败。
jobs -p | xargs kill
Run Code Online (Sandbox Code Playgroud)
我想根据输出jobs -p给出的内容,解决方案可能略有不同。就我而言
$ jobs -p
[1] - 96029 running some job
[2] + 96111 running some other job
Run Code Online (Sandbox Code Playgroud)
因此,执行以下操作是没有好处的。
$ jobs -p | xargs kill
kill: illegal process id: [1]
Run Code Online (Sandbox Code Playgroud)
另一方面,运行kill $(jobs -p)确实有效,但会产生大量错误消息,因为非 PID 字符串kill也会被传递。
所以,我的解决办法是grep先给PID再用xargs,如下:
$ jobs -p | grep -o -E '\s\d+\s' | xargs kill
Run Code Online (Sandbox Code Playgroud)
@pizdelect 点是我来到这里的原因。使用管道生成的作业有多个 pid。 jobs -p只会提供第一个。
for j in $(jobs | awk '{gsub("[^0-9]","",$1);printf "%%%s\n", $1}');do kill $j;done
Run Code Online (Sandbox Code Playgroud)
如果您想获取全部,则必须使用作业 ID。