协慌网

登录 贡献 社区

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

我想杀死所有通过的进程:

ps aux | grep my_pattern

怎么做?

这不起作用:

pkill my_pattern

答案

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

pkill -f my_pattern

杀死所有与字符串 “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 -ef在该用户可见的计算机上生成进程 ID 的列表。管道 grep 过滤掉包含该字符串的行。 grep -v grep说与执行 grepping 的进程本身不匹配。管道 awk 打印说,将默认定界符空白行拆分并过滤到第二列,这是我们的进程 ID。管道 xargs 启动了一个新进程,以发送所有这些 pid kill -9 ,从而结束所有进程。

上面的代码是坏的,危险的,丑陋的和令人讨厌的,原因有几个。

  1. 如果强制终止的代码正在执行任何具有低概率竞争条件的数据库操作或安全事务,那么百分之一的几分之一时间,该事务的原子性就会被破坏,从而产生不确定的行为。杀死 - 9 无需俘虏。如果您的代码对此敏感,请尝试将xargs kill部分替换为请求正常关闭的传输标志,并且仅当该请求被拒绝时,last-resort 才能kill -9

  2. 您有非零可能性会意外终止操作系统或在不相关的进程中导致未定义的行为,从而导致整个系统不稳定,因为ps -ef列出了可能存在的每个可能的进程,并且您无法确定某个奇怪的第三方库共享您的进程名称,或者在读取和执行 kill -9 之间的时间中,processid 已更改为其他名称,现在您意外地终止了一些您不打算使用的随机进程。

但是,如果您以非常独特的名称了解风险并对其进行控制,并且可以接受少量事务丢失或数据偶尔损坏的情况,那么 99.9%的时间就可以了。如果有问题,请重新启动计算机,确保没有任何进程冲突。因为这样的代码使技术支持脚本:“您是否尝试过重新启动计算机” 成为 5 级模因。

如果您在选择流程时需要更大的灵活性,请使用

for KILLPID in `ps ax | grep 'my_pattern' | awk ' { print $1;}'`; do 
  kill -9 $KILLPID;
done

您可以使用 grep -e 等。