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


当前回答

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

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

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

其他回答

如果您运行GNOME,您可以使用系统监视器(system ->Administration-> system monitor)像在Windows下一样杀死进程。KDE也有类似的东西。

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

pgrep -f [part_of_a_command]

如果结果如预期。配:

pkill -f [part_of_a_command]

如果进程卡住,无法完成请求,可以使用kill。

kill -9 $(pgrep -f [part_of_a_command])

如果为了安全起见,只终止最初启动的进程,请在用户名的同时添加-u

pkill -f [part_of_a_command] -u [username]

您可以使用killall <name>按名称杀死进程

Killall向所有人发出信号 进程运行指定的 命令。如果没有信号名称为 指定,则发送SIGTERM。 信号可以用 名称(例如-HUP或-SIGHUP)或编号(例如-HUP或-SIGHUP)。 -1)或通过选项-s。 如果命令名不是常规的 表达式(选项-r),并包含一个 斜杠(/),执行该操作的进程 将选择特定的文件 杀戮,独立于他们的名字。

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

一个长一点的替代词:

kill `pidof firefox`

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.*