【问题标题】: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 强制它。

标签: shell command-line kill


【解决方案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 替换为 --
          猜你喜欢
          • 1970-01-01
          • 2017-10-02
          • 2011-02-25
          • 2011-06-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多