如何通过名称而不是PID来终止进程?

时间:2008-10-02 04:57:20

标签: linux bash shell

有时当我尝试启动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')似乎只显示在PHP脚本本身中使用exec()执行的进程(因此它显示的唯一进程本身就是。)

18 个答案:

答案 0 :(得分:445)

答案 1 :(得分:84)

也可以使用:

pkill -f "Process name"

对我而言,它完美无缺,这正是我所寻求的。 在没有标志的情况下,pkill没有使用名称。

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

答案 2 :(得分:61)

您可以使用killall <name>

名称终止进程
  

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

     

可以通过指定信号   姓名(例如 -HUP -SIGHUP )或按号码(例如    -1 )或选项 -s

     

如果命令名称不规则   表达式(选项 -r )并包含一个   斜杠(/),执行它的进程   将选择特定文件   杀人,与他们的名字无关。

但是如果你没有看到ps aux的过程,你可能没有权利杀死它......

答案 3 :(得分:40)

更长的选择:

kill `pidof firefox`

答案 4 :(得分:16)

最简单的方法是首先检查您是否获得了正确的进程ID:

pgrep -f [part_of_a_command]

如果结果符合预期。跟着:

pkill -f [part_of_a_command]

答案 5 :(得分:14)

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

kill -9 `pidof firefox`

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

kill -9 `pgrep firefox`

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

> pgrep firefox
6316
6565
> pidof firefox
6565 6316

答案 6 :(得分:10)

在Mac上我找不到pgrep和pkill也没有killall工作所以写了一个简单的一个班轮脚本: -

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

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

答案 7 :(得分:8)

使用#killall命令:

#killall -9 <processname>

答案 8 :(得分:7)

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

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

*如果可以的话,我会提供pgrep

答案 9 :(得分:5)

用grep杀死:

kill -9 `pgrep myprocess`

答案 10 :(得分:4)

更正确的是:

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

答案 11 :(得分:3)

我通常使用killall命令see here来获取详细信息。

答案 12 :(得分:2)

我问自己同样的问题,但目前答案的问题是他们没有安全检查要杀死的程序所以......这可能会导致可怕的错误: )...尤其是多个进程匹配模式

作为免责声明,我不是专业人士,而且肯定有改进的余地。

所以我写了一个小脚本:

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

答案 13 :(得分:1)

默认kill命令接受命令名作为PID的替代。见kill (1)。经常出现的问题是bash提供了自己的kill,它接受​​作业编号,如kill %1,但不接受命令名称。这会阻碍默认命令。如果前者功能对后者比后者更有用,则可以通过调用

来禁用bash版本

enable -n kill

有关详细信息,请参阅bash (1)中的killenable条目。

答案 14 :(得分:0)

如果您运行GNOME,您可以使用系统监视器(System-&gt; Administration-&gt; System Monitor)来杀死进程,就像在Windows下一样。 KDE会有类似的东西。

答案 15 :(得分: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.*

答案 16 :(得分:-1)

ps aux | grep processname | cut -d' ' -f7 | xargs kill -9 $

答案 17 :(得分:-1)

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