如何杀死具有给定部分名称的所有进程?

新手上路,请多包涵

我想杀死我得到的所有进程:

 ps aux | grep my_pattern

怎么做?

这不起作用:

 pkill my_pattern

原文由 Łukasz Lew 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 467
2 个回答

使用 pkill -f ,它与命令行任何部分的模式匹配

pkill -f my_pattern

万一它不起作用,请尝试使用这个:

 pkill -9 -f my_pattern

原文由 Dor Shemer 发布,翻译遵循 CC BY-SA 4.0 许可协议

杀死与字符串“myProcessName”匹配的所有进程:

 ps -ef | grep 'myProcessName' | grep -v grep | awk '{print $2}' | xargs -r kill -9

资料来源:http: //www.commandlinefu.com/commands/view/1138/ps-ef-grep-process-grep-v-grep-awk-print-2-xargs-kill-9

为什么终端的“ps pipe kill”是邪恶的:

您从 ps -ef 刮到 kill -9 的整数管道很糟糕,如果您是 root 或具有提升权限的用户,您应该会感觉很糟糕,因为它不会让您的进程有机会干净地关闭套接字连接,清理临时文件,通知其子进程它即将消失或重置其终端特征。

而是发送 15,然后等待一两秒钟,如果不起作用,发送 2,如果不起作用,发送 1。如果不起作用,请删除二进制文件,因为程序表现不佳。

作为一般原则,我们不使用 Unix Railgun 来修剪树篱。 https://porkmail.org/era/unix/award.html#kill

上述命令说明:

ps -ef 在该用户可见的计算机上生成进程 ID 列表。管道 grep 过滤掉包含该字符串的行。 grep -v grep 表示在执行 grepping 的过程本身上不匹配。管道 awk 打印表示将默认分隔符空白处的行拆分并过滤到第二列,即我们的进程 ID。管道 xargs 启动一个新进程,将所有这些 pid 发送到 kill -9 ,结束它们。

为什么 ps pipe kill 是坏的、危险的、丑陋的和骇人听闻的:

  1. 您可能会意外终止操作系统或在不相关的进程中导致未定义的行为,从而导致整个系统不稳定,因为 ps -ef 列出了数千个进程,并且您无法确定某些 3rd 方进程共享您的进程名称,或者在读取和执行 kill -9 之间的时间,进程 ID 已更改为其他名称,现在您已经结束了一些与您无关的随机必要进程。

  2. 如果被强制结束的代码正在执行具有低概率竞争条件的任何数据库操作或安全事务,则该事务的原子性将在百分之几的时间内被破坏,从而产生未定义的行为。 kill -9 不带任何俘虏。如果您的代码对此敏感,请尝试将 xargs kill 部分替换为请求正常关闭的已传输标志,并且仅当该请求被拒绝时,最后求助于 kill -9

但是, 如果您了解所有风险并使用唯一名称对其进行控制,并且您可以接受一些丢失的交易或偶尔的腐败,那么您在 99.9% 的情况下都会没事的。如果出现问题,请重新启动计算机,确保没有任何进程冲突。正是因为这样的代码,才使技术支持脚本:“您尝试过重新启动计算机吗”成为 5 级模因。 “一个流氓机器人抓取了 ps 来查找整数并将它们发送到 kill -9 ,所以重新启动计算机以解决问题。

为什么不直接使用 pkill 哪个更容易?

The above gives me manual control because ps , grep , awk , kill and xargs are multi-platform标准。它可以完全控制使用哪个正则表达式引擎、匹配进程名称的哪个部分、处理区分大小写和异常管理。

 pkill -f -e -c myProcessName

对我做同样的事情,但请参阅 man pkill 在 Linux、Mac、Zune-Bash 和我的开源路由器的变体之间具有不同的行为、标志和正则表达式引擎。所以是的,把你的 35000 瓦 Unix-Railgun 放到 pkill 有能力的手中来修剪树篱。走着瞧吧。

原文由 Eric Leschinski 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题