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

ps aux | grep my_pattern

怎么做?

这不起作用:

pkill my_pattern

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

pkill -f my_pattern

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

pkill -9 -f my_pattern

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

for KILLPID in `ps ax | grep 'my_pattern' | awk ' { print $1;}'`; do 
  kill -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 pipe kill”是邪恶的:

你从ps-ef中抓取的整数管道是糟糕的,如果你是root用户或特权提升的用户,你应该感到糟糕,因为它不会给你的进程干净地关闭套接字连接、清理临时文件、通知它的子进程它将要离开或重设其终端特性的机会。

而是发送15个,等待一两秒钟,如果没有工作,发送2个,如果不工作,发送1个。如果没有,删除二进制文件,因为程序行为不好。

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

上述命令的解释:

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

为什么ps管道杀人是糟糕、危险、丑陋和粗俗的:

有一种很小的可能性是,你会意外地结束操作系统,或者在一个无关的进程中导致未定义的行为,导致整个系统不稳定,因为ps-ef列出了数千个进程,而且你不能确定某个第三方进程共享你的进程名称,或者在读取和执行kill-9之间的时间里,进程id已经更改为其他东西,现在你已经结束了一些与你无关的随机必要过程。如果强制结束的代码正在执行任何数据库操作或具有低概率竞争条件的安全事务,那么该事务的原子性将在一定程度上被破坏,从而产生未定义的行为。杀戮-9不带走囚犯。如果您的代码对此敏感,请尝试将xargs kill部分替换为请求正常关闭的传输标志,并且只有当该请求被拒绝时,才使用kill-9

但是,如果你了解所有的风险,并用唯一的名称控制它们,并且你可以处理掉一些交易或偶尔发生的腐败,那么99.9%的时间你会没事的。如果出现问题,请重新启动计算机,确保没有任何进程冲突。正是因为这样的代码,技术支持脚本“你尝试过重新启动计算机吗”成为了5级迷因。“一个流氓机器人刮取ps来查找整数,并将其发送到杀死-9,因此重新启动计算机以解决问题。

为什么不使用更简单的pkill?

以上内容为我提供了手动控制,因为ps、grep、awk、kill和xargs是多平台标准。它完全控制要使用的正则表达式引擎、要匹配的进程名称的哪个部分、处理区分大小写和异常管理。

pkill -f -e -c myProcessName

对我来说也是一样,但请看,在Linux、Mac、Zune Bash和我的开源路由器的变体之间,man pkill有不同的行为、标志和正则表达式引擎。所以,是的,把你的35000瓦Unix Railgun交给有能力的pkill来修剪树篱。看看会发生什么。


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

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 processes
pkill `pidof java`

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

警告:不再维护此项目。


可以使用以下命令:

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

or

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-r将进程名称模式解释为扩展正则表达式。

killall -r my_pattern

如果您不想为查找进程id而头疼,请使用regexp按名称终止进程。例如,要杀死chrome,请执行以下代码。

killall-r铬


最好和最安全的做法是将pgrep-f与kill一起使用,或者只使用pkill-f,greping ps的输出可能会出错。

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

此外,如果你的模式出现在ps的UID/USER、SDATE/START或任何其他列中,你会在输出中得到不需要的进程并杀死它们,pgrep+pkill不会受到这个缺陷的影响。

我还发现killall-r/-regexp不能与正则表达式一起使用。

pkill-f“^python3路径/to/my_script$”

男子pkill


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

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

你不必循环。


我接受了Eugen Rieck的答案并进行了处理。我的代码添加了以下内容:

ps-ax包含grep,所以我用grep-Eiv“grep”排除了它添加了一些“如果”和“回声”,使其具有可读性。

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

#!/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

这是一种方式:

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

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

这将传递给kill应用程序,该应用程序可以安全地终止所有相关的chrome进程。

这仍然很危险,小心。