如何在Linux上按名称而不是PID杀死进程?

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

676430 次浏览

我通常使用killall命令。

检查这个链接获取该命令的详细信息。

你可以通过的名字killall <name>杀死进程

killall向所有对象发送信号 进程运行指定的 命令。如果没有信号名称为

.指定,则发送SIGTERM

信号可以用 名称(例如玫瑰sighup)或数字(例如:玫瑰)。 -1)或通过选项- s

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

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

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

一个长一点的替代词:

kill `pidof firefox`

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

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

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

使用killall命令:

killall processname

使用-9-KILL强制终止程序(选项类似于kill命令)。

更正确的说法是:

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

用grep杀死:

kill -9 `pgrep myprocess`

也可以用:

pkill -f "Process name"
对我来说,一切都很完美。这是我一直在寻找的。

. Pkill不能使用没有标志的name

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

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

enable -n kill

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

我问自己同样的问题,但目前的答案的问题是,他们不安全检查要杀死的进程所以…这可能会导致可怕的错误:)…特别是如果有几个流程与此模式匹配

作为一个免责声明,我不是一个sh专业人士,当然有改进的空间。

所以我写了一个小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
ps aux | grep processname | cut -d' ' -f7 | xargs kill -9 $

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

最简单的方法是首先检查你是否获得了正确的进程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]

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

kill -9 `pidof firefox`

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

kill -9 `pgrep firefox`

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

> pgrep firefox
6316
6565
> pidof firefox
6565 6316

你可以通过将/directory/作为代码片段来杀死所有从某个目录开始的应用程序。当您从同一个应用程序目录启动同一个应用程序的多个组件时,这是非常有用的。

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

*如果可用,我更喜欢pgrep

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