杀死所有后台作业

Rob*_*ino 89 bash

是否有比以下更紧凑的杀死后台作业的形式:

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)

请注意,由于jobskill都内置于 中bash,因此您不应遇到Argument 列表太长类型的任何错误。

  • 同样对于后代来说,bahamat 认为在 `zsh` 中这样做的方式使他们没有资格成为该主题的任何权威。 (2认同)
  • 这个答案是不正确的。这不会杀死后台作业中的所有进程,而只会杀死进程组领导。尝试使用`sleep 3333 | 睡眠 3333 &`; 在 `kill $(jobs -p)` 之后,`jobs` 仍​​然会显示后台作业正在运行——只有 2 个 `sleep` 进程中的一个会被杀死。 (2认同)

小智 25

使用xargs代替$(jobs -p)子命令,因为如果jobs -p为空,则 kill 命令将失败。

jobs -p | xargs kill
Run Code Online (Sandbox Code Playgroud)

  • 如上所述,“-r”是“xargs”的“--no-run-if-empty”GNU 扩展的短格式,它指示它在标准输入没有数据时*不*运行该命令。 (4认同)
  • 不过,这具有完全相同的效果,它打印帮助并以代码 123 退出。 (2认同)

Fan*_*Bao 7

我想根据输出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)

  • 你用的是什么壳?`echo $0` 显示什么?“帮助工作”显示什么?所示输出 [不符合 POSIX 标准](http://pubs.opengroup.org/onlinepubs/9699919799/utilities/jobs.html);*任何* `jobs` 的实现都应该有一个带有预期行为的 `-p` 选项。 (3认同)
  • 感谢您指出了这一点。我正在使用 zsh,这就是奇怪输出的原因。我切换到 bash 并且 `jobs -p` 只输出 PID。我刚刚了解到 zsh 并不完全符合 POSIX。 (3认同)

Fro*_*ozz 7

@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。