如何杀掉所有与特定名称匹配的进程?

338

假设我想杀掉所有包含单词amarok的进程。我可以打印出我想要执行的命令,但是如何实际让shell执行这些命令呢?

ps aux | grep -ie amarok | awk '{print "kill -9 " $2}'
Output:
kill -9 3052
kill -9 3071
kill -9 3076
kill -9 3077
kill -9 3079
kill -9 3080
kill -9 3082
kill -9 3083
kill -9 3084
kill -9 3085
kill -9 3086
kill -9 3087
kill -9 3088
kill -9 3089
kill -9 4031

2
在你的命令行剩余部分后面添加 | sh -x 吗? - Jonathan Leffler
8
永远不要对一个进程使用 kill -9 命令,参见进程管理 - Fredrik Pihl
6
不使用"-9"命令的那篇文章并没有提供太多有用的信息,是否有更好的资料可以解释为什么人们不应该使用它?文章只是简单地说“不要使用"-9",并解雇使用它的人”,但我在其他任何地方看到的都是使用“kill -9 {pid}”来终止进程。 - dwanderson
4
man kill:kill -9 发送 SIGKILL 信号。这是一种“不可捕获,不可忽略”的强制终止方式。这意味着应用程序将无法清理和正确保存进度。 - AlexeyGy
2
通常情况下,当我想要终止一个进程时,是因为它被卡住了,并且不响应任何其他的终止命令。我实际上只在某些极端情况下使用kill命令,比如强制使用-9来终止那些非常卡死的进程。 - Rob
显示剩余3条评论
11个回答

554

来自 man 1 pkill

-f     The pattern is normally only matched against the process name.
       When -f is set, the full command line is used.

这意味着,例如,如果我们在 ps aux 中看到这些行:

apache   24268  0.0  2.6 388152 27116 ?        S    Jun13   0:10 /usr/sbin/httpd
apache   24272  0.0  2.6 387944 27104 ?        S    Jun13   0:09 /usr/sbin/httpd
apache   24319  0.0  2.6 387884 27316 ?        S    Jun15   0:04 /usr/sbin/httpd

我们可以使用pkill命令的-f选项全部杀死它们:

pkill -f httpd

2
我意识到这并不涉及这个问题的主题,但它确实展示了一个替代性、更简短的方法来完成你所尝试做的事情。 - Tim Bielawa
34
要增强力量,将“-9”添加到末尾! - mlissner
它会同时终止httpdx进程吗?当我使用pkill vi命令时,它会终止包含vi这个词的supervisorctl进程。 - Gank
1
真棒 - Ubuntu 18.04.1 LTS - Salathiel Genèse
对于不区分大小写的匹配,请使用-i,例如pkill -fi wine。要在操作前后进行验证,请使用ps uax | grep -i wine - vulcan raven
可以使用以下命令(适用于CentOS):ps -ef | grep -i '<进程名称>' | grep -iv grep | awk '{print $2}' | tr "\n" " " - Koby

266
ps aux | grep -ie amarok | awk '{print $2}' | xargs kill -9 

xargs(1):xargs -- 构造参数列表并执行实用程序。当您想将参数通过管道传递到像killls等工具时非常有用。


4
提到xargs的要点 - 所有这些pgrep / pkill的东西都很好,但是xargs是一个通用工具,并且在每个Linux / Unix上都是标准的。 - chrisdowney
4
"kill: 没有这个进程" - Cerin
8
这是因为它试图杀死已经完成的grep进程。这应该没问题。 - Costi Muraru
9
避免捕获grep进程的小技巧是:ps aux | grep -ie [a]marok | awk '{print $2}' | xargs kill -9。 - RCross
12
你可以加另一个grep命令来过滤掉grep自身(我发现这样更易读/记忆):ps aux | grep -ie amarok | grep -v grep | awk '{print $2}' | xargs kill -9grep -v表示grep --invert)。 - floer32
显示剩余3条评论

61

使用pgrep

kill -9 $(pgrep amarok)

34
即使更加简洁:pkill -9 amarok。 该命令的作用是强制终止名为“amarok”的进程。 - glenn jackman
3
pkill本地处理“包含单词<word>的每个进程”部分,而无需创建更多的管道或进程。请参阅-f选项以进行完整的进程名称搜索,以消除对pgrep的需求。 - Tim Bielawa
5
请注意,pkill默认允许对进程名称进行部分匹配。如果存在,该命令也会终止amarok2进程。如果您想指定精确的名称,请使用-x或-f选项。 - user79878
如果pgrep没有匹配项,它将失败。 - alfredocambera
2
对于全名匹配,请使用kill -9 $(pgrep -f amarok) - cinatic

40

安全的方法是:

pkill -f amarok

2
此外,我添加了-l标志。我实际上只是将pkill别名为pkill -fl,这样我就可以运行类似于pkill jboss的命令,并输出刚刚杀死的进程。 - nland
它会同时杀死amarokx进程吗?如果我使用pkill vi,它会杀死包含vi单词的supervisorctl - Gank
这与排名第一的答案(Tim的答案)有何不同?只是匹配示例名称,否则看起来完全相同吗?@ndland pkill: invalid option -- 'l' - 来自procps-ng 3.3.12的pkill。 - Xen2050

21

我认为这个killall命令正是你所需要的。 该命令被描述为“按名称杀死进程”。 它很容易使用。例如

killall chrome

这个命令将会杀掉所有Chrome进程。这里有一篇关于killall命令的链接:

http://linux.about.com/library/cmd/blcmdl1_killall.htm

希望这个命令能对您有所帮助。


这只是按名称匹配,而不是完整的命令行。绝对不同于搜索 ps aux 的输出。 - Xen2050

16

pkill -x 精确匹配进程名。

pkill -x amarok

pkill -f类似,但允许使用正则表达式模式。

请注意,pkill没有其他参数(例如-x,-f)将允许进程名称的部分匹配。因此,“pkill amarok”将杀死amarok,amarokBanana,bananaamarok等。

我希望-x是默认行为!


它也会杀死amarokx进程吗?我使用pkill vi,它会杀死包含“vi”单词的supervisorctl - Gank
@Gank,是的,任何进程名称中都包含“amarok”。 - user79878
如何只杀死 amarok 而不是 amarokx? - Gank
1
@Gank,-x标志。pkill -x amarok - user79878
1
为什么不是默认的呢?真的很奇怪。我杀掉了太多的进程,因为我没有使用 -x :| - mgutt

6

尝试使用 kill -s 9 `ps -ef |grep "Nov 11" |grep -v grep | awk '{print $2}'` 来终止11月11日的进程 或者使用 kill -s 9 `ps -ef |grep amarok|grep -v grep | awk '{print $2}'` 来终止包含单词amarok的进程


4
如果您想执行命令的输出,可以将其放在$(...)中,但是对于您特定的任务,请查看killallpkill命令。

3
你也可以将输出作为子进程进行评估,方法是用反引号或将其放在$()中间:
`ps aux | grep -ie amarok | awk '{print "kill -9 " $2}'`

 $(ps aux | grep -ie amarok | awk '{print "kill -9 " $2}')     

0

如果您正在使用cygwin或某些缺少killall的最小shell,则可以使用此脚本:

killall.sh - 按进程名称杀死进程。

#/bin/bash
ps -W | grep "$1" | awk '{print $1}' | xargs kill --

使用方法:

$ killall <process name>

我收到了 kill: invalid argument f 的错误信息。 - rosstex
1
尝试将-f替换为--。 - Tony O'Hagan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接