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

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

ps aux | grep my_pattern

怎么做呢?

这不工作:

pkill my_pattern
622762 次浏览

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

pkill -f my_pattern

以防万一它不起作用,也试着使用这个:

pkill -9 -f my_pattern

如果您在选择过程时需要更大的灵活性

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

您可以使用grep-e等。

终止所有匹配字符串“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管道杀死”是邪恶的:

你从ps -ef抓取到kill -9的整数管道很糟糕,你应该感觉很糟糕,如果你是root或具有提升权限的用户,就会加倍,因为它没有给你的进程一个机会干净地关闭套接字连接,清理临时文件,通知其子进程它正在消失或重置其终端特性。

相反,发送15,等待一两秒钟,如果没有工作,发送2,如果不工作,发送1。如果没有,删除二进制文件,因为程序表现不佳。

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

上面命令的解释:

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

为什么ps pipe kill是坏的,危险的,丑陋的和hackish:

  1. 有一个很小的可能性,你会意外地结束操作系统或导致未定义的行为在一个不相关的进程,导致整个系统不稳定,因为ps -ef列出了数千个进程,你不能确定一些第三方进程共享你的进程名,或者在读取和执行kiel-9之间的时间,进程已经改变了别的东西,现在你已经结束了一些随机的必要进程与你无关。

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

但是,如果你用独特的名称了解所有的风险和控制,并且你对一些交易掉线或偶尔的损坏没问题,那么99.9%的时间你都会没事的。如果有问题,重新启动计算机,确保没有任何进程冲突。正是因为这样的代码使得技术支持脚本:“你尝试过重启计算机吗”成为了5级模因。“一个Rogue Robot抓取了ps来查找整数并将它们发送给kill -9,因此重新启动计算机以清除问题。

为什么不使用pkill更容易?

上面给我手动控制,因为psgrepawkkillxargs是多平台标准。它完全控制使用哪个正则表达式引擎、匹配流程名称的哪一部分、处理大小写敏感性和异常管理。

pkill -f -e -c myProcessName

对我做同样的事情,但请参阅man pkill在Linux、Mac、Zune-Bash和我的开源路由器的变体之间有不同的行为、标志和正则表达式引擎。所以,是的,把你的35000瓦Unix-轨道枪放在有能力的人手中来修剪树篱。看看会发生什么。

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

ps aux | grep -c myProcessName

如果您需要检查该进程的计数,然后运行

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

之后,您可以使用

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

听起来很糟?

 pkill `pidof myprocess`

例子:

# kill all java processespkill `pidof java`

如果你认为pkill -f PATTERN有点太危险,我写了ezbit一个bash脚本,提示你在那些匹配你想要杀死的模式的进程中选择哪些进程。

警告:此项目不再维护。

您可以使用以下命令:

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

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

它为我工作。

您可以使用以下命令来

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

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

killall -r my_pattern

如果您不想为查找进程ID而头疼,请使用regexp按名称杀死进程。例如,杀死chrome以下代码就可以了。

killall -r chrome

最好和最安全的使用pgrep -fkill,或者只是pkill -fgrepingps的输出可能会出错。

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

此外,如果您的模式出现在psUID/USERSDATE/START或任何其他列中,您将在输出中获得不需要的进程并杀死它们,pgrep+pkill不会遭受此缺陷。

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

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

man pkill

找到了为不支持pkill的服务器执行此操作的最佳方法

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

你不必循环。

我接受了Eugen Rieck的回答并使用了它。我的代码添加了以下内容:

  1. ps ax包含grep,所以我用grep -Eiv 'grep'排除了它
  2. 添加了一些ifs和回声,使其具有可读性。

我创建了一个文件,命名为killserver,如下所示:

#!/bin/bashPROCESS_TO_KILL=bin/nodePROCESS_LIST=`ps ax | grep -Ei ${PROCESS_TO_KILL} | grep -Eiv 'grep' | awk ' { print $1;}'`KILLED=for KILLPID in $PROCESS_LIST; doif [ ! -z $KILLPID ];thenkill -9 $KILLPIDecho "Killed PID ${KILLPID}"KILLED=yesfidone
if [ -z $KILLED ];thenecho "Didn't kill anything"fi

搜索结果

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

这就是方法:

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

pgrep搜索与chrome相关的所有进程,并在以空格分隔的列表中返回它们。

这被传递给kill应用程序,它可以安全地kill所有相关的chrome进程。

这仍然是危险的,小心。