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

时间:2012-01-24 12:46:14

标签: linux bash posix

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

ps aux | grep my_pattern

怎么做?

这不起作用:

pkill my_pattern

14 个答案:

答案 0 :(得分:1109)

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

pkill -f my_pattern

答案 1 :(得分:117)

终止与字符串“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部分,并且仅当该请求被拒绝时,才能使用kill -9

  2. 如果ps -ef列出了可能存在的每个可能的进程,那么您将意外地结束操作系统或在不相关的进程中导致未定义的行为,这是非零的可能性,并且您可以不能确定一些奇怪的第三方库共享你的进程名称,或者在读取和执行kill -9之间的时间内,processid已经改变为其他东西,现在你不小心结束了一些你不想要的随机进程至。

  3. 但是,如果你用非常独特的名字了解它们的风险和控制,并且你可以通过一些丢弃的交易或偶尔的数据损坏,那么99.9%的时间你会没事的。如果出现问题,请重新启动计算机,确保没有任何进程冲突。这是因为像这样的代码使技术支持脚本:“你试过重启你的计算机”5级meme。

答案 2 :(得分:50)

如果您需要更灵活地选择流程,请使用

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

你可以使用grep -e等。

答案 3 :(得分:16)

您可以使用以下命令列出进程

ps aux | grep -c myProcessName 

如果您需要检查该流程的计数,请运行

ps aux | grep -c myProcessName |grep -v grep 

之后你可以使用

杀死进程
kill -9 $(ps aux | grep -e myProcessName | awk '{ print $2 }') 

答案 4 :(得分:10)

您也可以使用killall -r my_pattern -r将进程名称模式解释为扩展正则表达式。

killall -r my_pattern

答案 5 :(得分:7)

如果你判断pkill -f PATTERN有点过于危险,我写了ezkill一个bash脚本,提示你选择那些与你要杀死的PATTERN相匹配的进程。

答案 6 :(得分:5)

您可以使用以下命令

kill -9 $(ps aux | grep 'process' | grep -v 'grep' | awk '{print $2}')

答案 7 :(得分:3)

如果您不想头疼查找进程ID,请使用regexp按名称终止进程。例如,在代码之后杀死chrome就行了。

killall -r --regexp chrome

答案 8 :(得分:2)

您可以使用以下命令:

ps -ef | grep -i myprocess | awk {'print $2'} | xargs kill -9

ps -aux | grep -i myprocess | awk {'print $2'} | xargs kill -9

它对我有用。

答案 9 :(得分:1)

听起来不错?

 pkill `pidof myprocess`

示例:

# kill all java processes
pkill `pidof java`

答案 10 :(得分:0)

最好将pgrep -fkill一起使用,或者仅将pkill -fgrep配合使用,ps的输出可能会出错。

与使用ps | grep(需要通过添加| grep -v或使用模式技巧来过滤grep行)不同,pgrep只是不会自行设计。

此外,如果您的模式出现在ps的{​​{1}} / UIDUSER / SDATE或任何其他列中,您将无用输出中的进程并杀死它们,START + pgrep不受此缺陷的影响。

我还发现pkill / killall -r不适用于我的正则表达式。

-regexp

man pkill

答案 11 :(得分:0)

找到了针对不支持' pkill '

的服务器的最佳方法

kill -9 $(ps ax | grep My_pattern | fgrep -v grep | awk'{print $ 1}')

您不必循环。

答案 12 :(得分:0)

我接受了Eugen Rieck的回答并与之合作。我的代码添加了以下内容:

  1. ps ax包含grep,因此我用grep -Eiv 'grep'排除了它
  2. 添加了一些if和echos以使其易于阅读。

我创建了一个名为killserver的文件,它就在这里:

#!/bin/bash
PROCESS_TO_KILL=bin/node
PROCESS_LIST=`ps ax | grep -Ei ${PROCESS_TO_KILL} | grep -Eiv 'grep' | awk ' { print $1;}'`
KILLED=
for KILLPID in $PROCESS_LIST; do
  if [ ! -z $KILLPID ];then
    kill -9 $KILLPID
    echo "Killed PID ${KILLPID}"
    KILLED=yes
  fi
done

if [ -z $KILLED ];then
    echo "Didn't kill anything"
fi

结果

➜  myapp git:(master) bash killserver
Killed PID 3358
Killed PID 3382
Killed
➜  myapp git:(master) bash killserver
Didn't kill anything

答案 13 :(得分:0)

这是方法:

kill -9 $(pgrep -d' ' -f chrome)