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


618

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

ps aux | grep my_pattern

怎么做?

这不起作用:

pkill my_pattern

11
my_pattern简单的名称的子串,或者它包含任何正则表达式的特殊字符?
Sven Marnach 2012年

Answers:


1313

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

pkill -f my_pattern

7
@Jayan:它的杀戮也很随意。处理起来非常容易……
thkala 2012年

1
@Jayan:你不会说服我的:-)。坚持使用的第三方脚本让我厌倦了很多次pkill-最常见的错误是假设在任何给定时间每个二进制文件只能存在一个实例。
thkala 2012年

4
对于像我一样找到此答案的所有Mac用户,Mac等效为killall -m my_pattern
Zev Eisenberg 2014年

1
如果你有一些挂不被杀使用过程pkill的-f -9无情地杀死他们
麦克

18
我建议pgrep先使用来验证您要杀死的东西。您可以pgrep -l用来查看进程名称或pgrep -a查看完整的命令行。它使用与pkill相同的标志。因此,在这种情况下,您可以使用pgrep -fa my_pattern
studgeek

158

杀死所有与字符串“ 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已更改为其他名称,现在您意外地终止了一些您不打算使用的随机进程。

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


15
如果找不到与名称匹配的进程,将抛出错误。ps -ef | grep myProcessName | grep -v grep | awk '{print $2}' | xargs -r kill -9如果未提供任何参数,则可能希望使xargs不执行命令。
Epigene '16

2
只需稍作修改,也许最好引用进程名称: ps -ef | grep 'myProcessName' | grep -v grep | awk '{print $2}' | xargs -r kill -9 不带引号,我的一个后台进程在第一次运行时就被杀死了。再次运行它杀死了其余的人。
阿里·海德

-r选项似乎在OS X上不存在。
Danijel

52

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

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

您可以使用grep -e等。


4
-1您不需要循环,您可以kill -9 `ps ax | awk '[m]y_pattern { print $1 }'`(只需注意重构;另请参阅我对@synthesizerpatel的回答的评论)。
2012年

11
@tripleee downvote没问题,但是您确实意识到,OQ是“我想杀死我通过的所有进程:ps aux | grep my_pattern”,这是我有义务接受的。
Eugen Rieck

Kill将一口气杀死所有进程,因此您不需要循环。如果ps返回三个进程123、234和345,则kill 123 234 345可以选择一个rmcat多个文件参数。
Tripleee'7

@tripleee我建议删除grep
Eugen Rieck

for KILLPID in ps斧| grep'puma'| grep -v'grep'| awk'{print $ 1;}' ; do kill -9 $KILLPID; done将删除grep
Justin E

18

您可以使用以下命令列出该过程

ps aux | grep -c myProcessName 

如果您需要检查该进程的数量,请运行

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

之后,您可以使用以下命令终止进程

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

您可以使用以下命令列出ps aux |进程。grep -c myProcessName如果需要检查该进程的计数,请运行ps aux | grep -c myProcessName | grep -v grep之后,您可以使用kill -9 $(ps aux | grep -e myProcessName | awk'{print $ 2}')
Nived Thanima

13

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

killall -r my_pattern

8

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


7

您可以使用以下命令

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

4

如果您不想麻烦查找进程ID,请使用regexp按名称杀死进程。例如,杀死chrome可以解决问题。

killall -r --regexp chrome


1
您只需要-r --regexp,分别是short和GNU long选项。
BigSmoke

3

您可以使用以下命令:

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

要么

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

这个对我有用。


1
欢迎使用StackOverflow。请为代码行使用4空格或制表符缩进,以便将它们格式化为代码块。最好的问候
YakovL

2

听起来不好吗?

 pkill `pidof myprocess`

例:

# kill all java processes
pkill `pidof java`


1

这是最好的,最安全的使用pgrep -fkill,或只是pkill -fgrep荷兰国际集团ps的产量可能会出错。

与使用ps | grep需要通过添加| grep -v或使用模式技巧来过滤grep行的方法不同,pgrep只是不会根据设计进行选择。

此外,应你的模式出现在psUID/ USERSDATE/ START或任何其他列,你会在输出中获得的无用进程和杀死他们,pgrep+ pkill不从这个缺陷受到影响。

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

pkill -f "^python3 path/to/my_script$"

man pkill


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

0

这是这样的:

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

3
尽管此代码可以回答问题,但提供有关如何和/或为什么解决问题的其他上下文将提高​​答案的长期价值。
伊戈尔·F。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.