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

Posted

技术标签:

【中文标题】如何杀死所有匹配名称的进程?【英文标题】:How to kill all processes matching a name? 【发布时间】:2011-09-16 21:31:16 【问题描述】:

假设我想杀死所有包含单词 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 永远不要在进程上使用kill -9 请参阅[进程管理][1] [1]:mywiki.wooledge.org/…... 那篇关于不使用-9 的文章非常无用——有没有更好的信息说明人们为什么不应该使用它?它只是说“不要,解雇使用它的人”;但我在其他地方看到的只是kill -9 pid 是如何杀死某些东西...... 来自man kill: kill -9 发送 SIGKILL 信号。这是non-catchable, non-ignorable kill。这意味着应用程序将无法清理并正确保存进度。 通常当我想杀死一个进程时,因为它卡住了,并且它没有响应任何其他的杀死命令。我真正使用 kill 命令的唯一一次是如果某些东西被严重冻结,然后我用 -9 强制它。 【参考方案1】:

来自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

【讨论】:

我意识到这并没有解决这个问题的主题,但它确实展示了另一种更短的方法来做你想做的事情。 如需额外的力量,请在末尾添加-9 它也会杀死httpdx 进程吗?我 pkill vi,它杀死了单词中包含“vi”的supervisorctl 真棒 - Ubuntu 18.04.1 LTS 对于不区分大小写的匹配,使用-i,如pkill -fi wine。要验证前后,请使用ps uax | grep -i wine【参考方案2】:
ps aux | grep -ie amarok | awk 'print $2' | xargs kill -9 

xargs(1): xargs -- 构造参数列表并执行实用程序。当您想将参数传递给 killls 等时很有帮助。

【讨论】:

提到 xargs 的要点 - 所有这些 pgrep / pkill 东西都很好,但是 xargs 是一个通用工具,并且是每个 linux/unix 的标准。 "kill: 没有这样的进程" Cerin 那是因为它也试图杀死已经完成的 grep 进程。应该没问题。 有一个小技巧可以避免捕获 grep 进程:ps aux | grep -ie [a]marok | awk '打印 $2' | xargs 杀死 -9 您还可以添加另一个 grep 调用来过滤掉 grep(我觉得这更容易阅读/记住)ps aux | grep -ie amarok | grep -v grep | awk 'print $2' | xargs kill -9grep -v 代表 grep --invert【参考方案3】:

使用pgrep

kill -9 $(pgrep amarok)

【讨论】:

更优雅:pkill -9 amarok pkill 本地处理“包含单词 的每个进程”部分,而无需创建更多管道或进程。请参阅 -f 选项以进行完整的进程名称搜索,以消除对 pgrep 的需要。 请注意 pkill 默认情况下允许对进程名称进行部分匹配。如果 amarok2 存在,这个命令也会杀死它。如果要指定确切的名称,请使用 -x 或 -f。 如果与 pgrep 不匹配,它将失败 全名匹配使用kill -9 $(pgrep -f amarok)【参考方案4】:

安全的方法是:

pkill -f amarok

【讨论】:

为了补充这一点,我添加了-l 标志。我实际上只是将pkill 别名为pkill -fl,这样我就可以运行pkill jboss 之类的东西,它会吐出它刚刚杀死的进程。 它也会杀死amarokx 进程吗?我 pkill vi,它杀死了单词中包含“vi”的supervisorctl 这与***(蒂姆)的答案有何不同?只匹配示例名称,否则看起来相同? @ndland pkill: invalid option -- 'l' - 来自 procps-ng 3.3.12 的 pkill 【参考方案5】:

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

killall chrome

这个命令会杀死Chrome的所有进程。这里是killall命令的链接

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

希望这个命令可以帮助到你。

【讨论】:

这仅按名称匹配,而不是完整的命令行。绝对和搜索ps aux的输出不一样【参考方案6】:

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

pkill -x amarok

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

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

我希望 -x 是默认行为!

【讨论】:

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

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

【讨论】:

【参考方案8】:

尝试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 的进程

【讨论】:

【参考方案9】:

您还可以将您的输出评估为一个子流程,方法是用反引号包围所有内容或将其放在 $() 中:

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

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

【讨论】:

【参考方案10】:

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

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

【讨论】:

【参考方案11】:

如果您使用的是 cygwin 或一些缺少 killall 的最小 shell,您可以使用这个脚本:

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

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

用法:

$ killall <process name>

【讨论】:

我收到kill: invalid argument f 尝试将 -f 替换为 --

以上是关于如何杀死所有匹配名称的进程?的主要内容,如果未能解决你的问题,请参考以下文章

杀进程的三种方式

linux ubuntu kill指令和killall指令的区别(killall会终止所有与该名字匹配的进程)

Linux之killall命令

killall命令

关于 国产麒麟系统使用killall命令杀死模糊匹配进程失败“未找到该进程” 的解决方法

关于 国产麒麟系统使用killall命令杀死模糊匹配进程失败“未找到该进程” 的解决方法