杀死所有后台工作


63

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

for i in {1..5}; do kill %$i; done

另外,{1..5}中显然有一个硬编码的幻数,我如何在不做以下操作的情况下使N为正确的数字而使其成为“ N”?

$(jobs | wc -l)

我实际上在PS1中使用\ j来获取托管作业的数量,这等效吗?


3
kill $(jobs -p)似乎更容易。
2012年

如果可能,我宁愿单独取消工作。(不过,我可能会误解了您的评论)
Robottinosino 2012年

for pid in $(jobs -p); do kill $pid; done
jw013

3
@ jw013这不仅容易,而且实际上是正确的(请张贴为答案),这与基于计数输出行数的解决方案不同,该解决方案jobs仅在作业碰巧被连续编号时才起作用。哦,“单独杀死作业”是没有意义的:将多个PID传递给kill命令与单独传递它们完全一样。
吉尔斯

我输入的命令不正确,杀死了$(jobs -p)个单词,对我来说也很正确。准备接受。
Robottinosino 2012年

Answers:


102

刚刚kill通过管理的所有后台作业bash,做

kill $(jobs -p)

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


2
同样对于后代来说,巴哈马特认为这样做的方法是zsh取消他们作为该主题的任何权威的资格。
peth 2013年

我觉得我应该知道这一点,但是'$'在这里如何工作?
fersarr

1
@fersarr 这里你去
jw013

@bahamat这实际上不起作用,因为PID可能在字段2或3中,具体取决于作业是%+还是%-之一。有效的是kill %${(k)^jobdirs},确实更长。如果您需要列出PID,则可以使用更长的PID ${${jobstates#*:*:}%%=*}
吉尔斯

在CentOS上,我的提示正在等待更多输入>
Janac Meena

15

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

jobs -p | xargs kill

1
尽管这具有完全相同的效果,但它会打印帮助并以代码123退出

1
该命令在OSX上可以正常运行,但在Debian上不起作用
brunocascio

这在CentOS 6
Janac Meena '18

jobs -p | xargs -rn10 kill如果jobs -p不返回任何PID,则会做得更好。请注意,该-r选项是GNU扩展。
NarūnasK16:27

如上所述,GNU扩展名-r是的短格式,如果stdin没有数据,则指示它运行命令。--no-run-if-emptyxargs
Anthony Geoghegan

3

我更喜欢在杀死它们之前检查是否存在任何作业-这样,即使没有任何运行,脚本也不会失败。

它的键入也更短。扔在你的.bash_profile

function killjobs () {
    JOBS="$(jobs -p)";
    if [ -n "${JOBS}" ]; then;
        kill -KILL ${JOBS};
    fi
}

然后运行:

killjobs

杀死正在运行的任何作业。


1

我想通过在macOS上向每个进程发送SIGINT来优雅地终止一些后台复合命令。没有其他解决方案可以正常工作,因此我想到了:

jobs -p | xargs -n1 pkill -SIGINT -g

jobs -p 列出当前shell启动的后台进程。

xargs -n1 为每个工作执行一次杀戮。

pkill -SIGINT -g 将SIGINT(与ctrl + c相同)发送到进程组中的所有进程。


1

我猜取决于输出结果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

1
您正在使用什么外壳?是什么echo $0表现?是什么help jobs表现?所示的输出不符合POSIX的任何实现jobs都应具有-p预期行为的选项。
通配符

1
感谢您指出了这一点。我正在使用zsh,这就是输出奇怪的原因。我切换到bash,jobs -p仅输出PID。我刚刚了解到zsh并不完全符合POSIX。
樊晨报

0

看起来就像jobs -p | xargs kill工作一样,但是它会产生一些不需要的输出,以杀死它们。在这里,我jobs -p按具有/不具有+或-字符对输出进行分组

function killjobs() {
    JOBS=$(jobs -p)
    echo $JOBS | grep -v "+\|-"| awk '{print $2}' | xargs kill -9
    echo $JOBS | grep "+\|-"| awk '{print $3}' | xargs kill -9
}

以后你可以打电话 killjobs

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.