如何杀死所有与名称匹配的进程?


260

假设我想杀死所有包含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

| sh -x在命令行的其余部分之后添加吗?
乔纳森·勒夫勒

7
从未kill -9在流程中使用过,请参阅[流程管理] [1] [1]:mywiki.wooledge.org/… ...
Fredrik

除了上面的评论外,kill -9不仅是一个坏主意,而且还试图通过它们的名称杀死多个进程。进程名称没有唯一的标识,因此不适合用于标识。
拉乌尔

它也会杀死amarokx进程吗?我杀死了vi,它杀死了 supervisorctl其中包含“ vi”的单词。
甘克2015年

4
那篇关于不使用的文章-9毫无帮助-关于为什么人们不应该使用它,还有更好的信息吗?它只是说:“别开火,解雇使用它的人”;但我在其他任何地方都没有看到的kill -9 {pid}是如何杀死某些东西……
dwanderson

Answers:


437

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

1
我意识到这并不能解决这个问题的主题,但是它确实展示了一种替代的,简短的方法来完成您要尝试的操作。
Tim Bielawa

19
为了获得额外的力量,请添加-9到最后!
mlissner

它也会杀死httpdx进程吗?我杀死了vi,它杀死了 supervisorctl其中包含“ vi”的单词。
甘克2015年

真棒- Ubuntu的LTS 18.04.1
撒拉杰尼斯

对于不区分大小写的匹配,请使用-i,例如pkill -fi wine。要在之前和之后进行验证,请使用ps uax | grep -i wine
火神乌鸦

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

xargs(1):xargs-构造参数列表并执行实用程序。有用的,当你想在参数管道类似killls或等等。


3
提及xargs的要点-所有这些pgrep / pkill的东西都很好,但是xargs是通用工具,并且是每个linux / unix上的标准。
chrisdowney 2011年

4
“杀戮:没有这样的过程”
塞林2014年

3
Cerin那是因为它也试图杀死grep进程,该进程已经完成了。应该没事的
Costi Muraru 2014年

6
避免捕获grep进程有一个小技巧:ps aux | grep -ie [a] marok | awk'{print $ 2}'| xargs kill -9
RCross

8
您还可以添加另一个grep调用以过滤掉grep(我觉得这更易于阅读/记住)ps aux | grep -ie amarok | grep -v grep | awk '{print $2}' | xargs kill -9grep -v表示grep --invert
shiftcatcher 2014年

47

pgrep

kill -9 $(pgrep amarok)

26
pkill -9 amarok
优雅

1
pkill本地处理“包含单词<word>的每个进程”部分,而无需创建更多管道或进程。请参阅-f选项,以进行完整的进程名称搜索,从而无需pgrep。
Tim Bielawa

2
注意,默认情况下pkill允许部分匹配进程名称。如果存在,此命令还将杀死amarok2。如果要指定确切名称,请使用-x或-f。
user79878 2014年

如果不是为p纤ep比赛会失败
alfredocambera

用于全名比赛kill -9 $(pgrep -f amarok)
cinatic

27

执行此操作的安全方法是:

pkill -f amarok

1
为此,我添加了-l标志。我实际上只是别名pkill为,pkill -fl所以我可以运行类似的东西pkill jboss,它将吐出刚刚终止的进程。
nland

它也会杀死amarokx进程吗?我杀死了vi,它杀死了 supervisorctl其中包含“ vi”的单词。
甘克2015年

这与最高答案(Tim's)有何不同?仅匹配示例名称,否则看起来完全一样?@ pkill: invalid option -- 'l'ndland-procps-ng 3.3.12中的pkill
Xen2050 '18

18

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

killall chrome

此命令将杀死Chrome的所有进程。以下是有关killall命令的链接

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

希望此命令可以对您有所帮助。


这仅按名称匹配,而不是完整的命令行。绝对与ps aux
search

12

pkill -x完全匹配进程名称。

pkill -x amarok

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

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

我希望-x是默认行为!


它也会杀死amarokx进程吗?我杀死了vi,它杀死了 supervisorctl其中包含“ vi”的单词。
甘克2015年

@Gank,是的,在任何地方带有“ amarok”的任何进程名称。
user79878 2015年

如何仅杀死amarok而不是amarokx?
甘克2015年

1
@ Gank,-x标志。pkill -x amarok
user79878's

4

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


3

您还可以将所有内容都用反勾或将其放在$()内,从而将输出作为子过程进行评估:

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

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

3

尝试kill -s 9ps -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一词的进程


0

也许将命令添加到可执行文件,设置+ x权限,然后执行?

ps aux | grep -ie amarok | awk '{print "kill -9 " $2}' > pk;chmod +x pk;./pk;rm pk

-1

如果您使用的是cygwin或缺少的一些最小外壳程序,则killall可以使用以下脚本:

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

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

用法:

$ killall <process name>

我得到kill: invalid argument f
rosstex

1
试着用替换-f -
托尼·奥黑根
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.