有时当我试图启动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()执行的进程(所以它显示的唯一进程是本身)。


当前回答

更正确的说法是:

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

其他回答

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

Awk的联机程序,它解析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.*

也可以用:

pkill -f "Process name"

对我来说,效果很好。这是我一直在寻找的。 Pkill不能在没有旗帜的情况下使用名称。

当设置-f时,将使用完整的命令行进行模式匹配。

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

启用-n kill

有关更多信息,请参阅bash(1)中的kill和enable条目。

奇怪,但我还没见过这样的解决方案:

kill -9 `pidof firefox`

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

kill -9 `pgrep firefox`

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

> pgrep firefox
6316
6565
> pidof firefox
6565 6316