如何通过名称而不是PID杀死进程?


349

有时,当我尝试启动Firefox时,显示“ Firefox进程已在运行”。因此,我必须这样做:

jeremy@jeremy-desktop:~$ ps aux | grep firefox
jeremy    7451 25.0 27.4 170536 65680 ?        Sl   22:39   1:18 /usr/lib/firefox-3.0.1/firefox
jeremy    7578  0.0  0.3   3004   768 pts/0    S+   22:44   0:00 grep firefox
jeremy@jeremy-desktop:~$ kill 7451

我想要的是一个可以为我完成所有任务的命令。它会grep在进程列表中使用一个输入字符串并将其(或其他内容)放入其中,并杀死输出中的所有进程:

jeremy@jeremy-desktop:~$ killbyname firefox

我尝试在PHP中执行此操作,但exec('ps aux')似乎只显示已exec()在PHP脚本本身中执行过的进程(因此,它显示的唯一进程是其自身。)


当我看到说Firefox已经运行的窗口时,我通常只需要等待一秒钟,然后我就可以再次运行Firefox(当然,并非总是如此)。
nuoritoveri 2014年

1
这是最安全的方式JohnB在此回答说: stackoverflow.com/questions/6381229/...
tecnoshopbq


这是一个古老的问题,但是您可以更改接受的答案吗?您标记的进程会因许多进程而失败,例如由JVM运行的进程。
路易斯·德·索萨

对于引用此主题的任何人,在上面的评论中,路易斯引用了以下吹捧该pkill -f "Process name"命令的答案……
Digger

Answers:


505
pkill firefox

详细信息:http : //linux.about.com/library/cmd/blcmdl1_pkill.htm


7
在执行屠杀过程之前,使用pgrep找出要杀死的东西是一件好事。特别是在使用时-f
Akrikos 2013年

pkill不是很友好。您不能像killall一样使用它来命名。
章鱼

2
pkill -U <username>很方便。我有一个Solaris Web服务器,即实际的Web服务器守护程序,是使用其自己的用户设置为服务的。因此,由用户指定是触发重新启动的简单方法。
2015年

6
强制杀死:pkill -9 firefox
Justas 2015年

这最多只能工作一半。您至少需要-f标志才能使用综合解决方案。
路易·德·索萨

112

也可以使用:

pkill -f "Process name"

对我来说,它工作得很好。这就是我一直在寻找的东西。没有标志,pkill不能与名称一起使用。

-f被设置时,完整的命令行用于模式匹配。


2
真正用于搭配葡萄酒-f选项是真正需要的。例如pkill -f "EvilWindowsServer.exe"
CodeBrauer 2015年

这应该是公认的答案。对于许多程序,例如在JVM上运行的程序,第一个答案都会失败。
路易·德·索萨

1
我也必须添加该-f标志,以终止运行Python脚本的后台进程。
梅森

就我而言,我需要2个标志:pkill -f -9 PROCESSNAME
Slavik

其在centos7.thank中的工作
sirmagid

64

您可以通过杀死进程名称killall <name>

killall向运行任何指定命令的所有进程发送信号。如果未指定信号名称,则发送SIGTERM。

信号可以通过名称(例如-HUP-SIGHUP)或数字(例如 -1)或选项-s来指定

如果命令名称不是正则表达式(选项-r)并且包含斜杠(/),则将选择执行该特定文件的进程进行杀死,而与它们的名称无关。

但是,如果您看不到的过程ps aux,则可能无权杀死它……


6
要强制终止没有响应的程序,请发送KILL而不是TERM:killall -s KILL firefox
Martin Hansen

45

更长的选择:

kill `pidof firefox`

25
pidof firefox | xargs kill -9
hbt

1
这对于嵌入式设备在busybox下有效:)
nwgat

25

最简单的方法是首先使用以下命令检查您是否获得了正确的进程ID:

pgrep -f [part_of_a_command]

如果结果符合预期。与:

pkill -f [part_of_a_command]

19

奇怪,但是我还没有看到这样的解决方案:

kill -9 `pidof firefox`

它还可以杀死多个进程(多个pid),例如:

kill -9 `pgrep firefox`

我更喜欢,pidof因为它具有单行输出:

> pgrep firefox
6316
6565
> pidof firefox
6565 6316

当我执行此操作时,我得到了错误kill: invalid number 'pidof myprogram'。这里有什么不好?
Brethlosze

这只是挽救了我的生命...我不想写更多,但我很高兴在这里找到了它。谢啦。
MilMike '17

1
来晚了,但万一有人想知道……@Brethlosze,您打了个勾号,而命令要求反引号。
光谱

谢谢!..我将(并且我正在)意识到这些反引号:)
Brethlosze

13

杀死snippet启动路径中的所有进程。您可以通过将/ directory /作为摘要杀死从某个目录启动的所有应用。当您从同一应用程序目录中为同一应用程序启动多个组件时,这非常有用。

ps ax | grep <snippet> | grep -v grep | awk '{print $1}' | xargs kill

*如果可以的话,我会推荐pgrep


1
这是反模式的常见组合。使用与自身(或包含脚本的名称)不匹配的正则表达式,并避免使用uselessgrepps ax | awk '/[s]nippet/ { print $1 }' | xargs kill
Tripleee

1
在避免无用的grep的同时,您也不会避免错别字并不能在参数化<snippet>的自动化过程中使用该命令
Mykhaylo Adamovych

这确实是最好的方法!
Abhinandan Dubey

理解为什么@tripleee的[s]作品会与awk流程本身不匹配会很棒吗?
andig

因为正则表达式[x]y匹配字符串xy,反之则不然。这是常见的常见问题解答。该链接指向20年前的页面,其中对此进行了更详细的说明。那时已经是一个反复出现的问题。
三人房

11

在Mac上,我找不到pgrep和pkill,它们也都无法正常工作,因此编写了一个简单的划线脚本:

export pid=`ps | grep process_name | awk 'NR==1{print $1}' | cut -d' ' -f1`;kill $pid

如果有更简便的方法,请分享。


1
大声笑。这对这样的任务是疯狂的命令。没关系。您打过那条简单的电话吗?:D Simple is killall
m3nda 2014年

@ erm3nda :-)同意。回首它看起来很疯狂。无法回想为什么killall不能在我的Mac上运行。
Dhiraj 2014年

当您想终止某个Java进程(例如“ jboss”)时,这非常有用。在这种情况下,killall没有帮助。
1


6

使用grep杀死:

kill -9 `pgrep myprocess`

5

更正确的是:

export pid=`ps aux | grep process_name | awk 'NR==1{print $2}' | cut -d' ' -f1`;kill -9 $pid

1
为什么export要在同一过程中只使用一次变量?
Tripleee


3

我当时在问自己同样的问题,但是当前答案的问题是他们不能安全地检查要杀死的进程,因此...可能会导致可怕的错误:)...尤其是如果多个进程与模式匹配

作为免责声明,我不是sh pro,当然还有改进的空间。

所以我写了一些sh脚本:

#!/bin/sh

killables=$(ps aux | grep $1 | grep -v mykill | grep -v grep)
if [ ! "${killables}" = "" ]
then
  echo "You are going to kill some process:"
  echo "${killables}"
else
  echo "No process with the pattern $1 found."
  return
fi
echo -n "Is it ok?(Y/N)"
read input
if [ "$input" = "Y" ]
then
  for pid in $(echo "${killables}" | awk '{print $2}')
  do
    echo killing $pid "..."
    kill $pid 
    echo $pid killed
  done
fi

2

如果运行GNOME,则可以像在Windows下一样使用系统监视器(系统->管理->系统监视器)来终止进程。KDE会有类似的东西。


2

默认kill命令接受命令名作为PID的替代。见杀人(1)。经常发生的麻烦是bash提供了自己的名称kill,该名称可以接受作业编号,例如kill %1,但不能接受命令名称。这阻碍了默认命令。如果前者的功能比后者更有用,则可以bash通过调用禁用该版本

enable -n kill

有关更多信息,请参见killbash中的enable条目(1)


我如何重新启用该操作enable -n kill
Brethlosze

1
@hyprfrcbenable kill
Vee



0

awk oneliner,它解析ps输出的标题,因此您不需要关心列号(但列名)。支持正则表达式。例如,要杀死所有进程,该可执行文件的名称(无路径)包含单词“ firefox”,请尝试

ps -fe | awk 'NR==1{for (i=1; i<=NF; i++) {if ($i=="COMMAND") Ncmd=i; else if ($i=="PID") Npid=i} if (!Ncmd || !Npid) {print "wrong or no header" > "/dev/stderr"; exit} }$Ncmd~"/"name"$"{print "killing "$Ncmd" with PID " $Npid; system("kill "$Npid)}' name=.*firefox.*
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.