如何杀死所有匹配名称的进程?
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 -- 构造参数列表并执行实用程序。当您想将参数传递给 kill
或 ls
等时很有帮助。
【讨论】:
提到 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 -9
(grep -v
代表 grep --invert
)【参考方案3】:
使用pgrep
kill -9 $(pgrep amarok)
【讨论】:
更优雅:pkill -9 amarok
pkill 本地处理“包含单词 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】:
如果您想执行命令的输出,可以将其放在$(...)
中,但是对于您的具体任务,请查看killall
和pkill
命令。
【讨论】:
【参考方案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会终止所有与该名字匹配的进程)