“ killall”和“ pkill”有什么区别?


92

使用只是普通后kill <some_pid>在Unix系统上多年,我学会pkill从一个年轻的Linux精明的同事同事1

我很快就接受了Linux方式,在许多白天和黑夜,减速和竞赛条件下进行pgrep-ing和pkill-ing。一切都很好。

但是现在我什么都看不见了killall。操作方法似乎仅提及killall,而且我不确定这是否是某种并行开发,或者killall是的后续产品pkill,还是其他产品。

它似乎具有更强的针对性pkill,但我确定我遗漏了一些东西。

可以使用Ubuntu / Debian精通2的人员解释何时(或为什么)killall应该使用(特别是应优先使用pkillpkill通常看起来更容易,因为我可以用名字匹配,至少在默认情况下会更草率))。

谈到时killall,我没有想到在某些Unix系统(Solaris,AIX 、?)上会杀死所有用户进程的命令。这是该版本的描述,来自IBM AIX的联机帮助页

killall命令会取消您启动的所有进程,但产生killall进程的进程除外。此命令提供了一种方便的方法来取消由您控制的shell创建的所有进程。由root用户启动时,killall命令会取消所有可启动进程(启动该进程的进程除外)。如果指定了多个信号,则仅最后一个有效。

1个 “同事”是从“同事”免费升级的,所以也可以。
2本来我以为这是Linux或Debian,但有消息说Linux killall源自BSD风格的Unix。

Answers:


68

我想您会在kill-to中看到killall,因为默认情况下它需要精确的进程名称,而pkill则进行基本模式匹配。因此,killall对于用户盲目复制和粘贴更为安全。

Pkill和Killall都有不同的选择。Killall具有根据进程年龄进行匹配的标记,pkill具有仅杀死给定tty上的进程的标记。Etcetera ad作呕。两者都不是更好,他们只是有不同的专业。

从他们的手册页中可以看出,killall来自psmisc软件包,该软件包具有多个流程管理实用程序,但其中显然没有ps。这是procps软件包,其中包含ps,top,kill和pkill(以及其他)。我会打赌procps本来就不具备杀伤能力,所以psmisc抓痒了,提出了killall。

pkill的/ p纤ep手册页说,他们在Solaris中7中引入正如您所提到,jgbelacqua,的Solaris的killall不是工具提供Psmisc做,这样的Solaris大概只用了procps的包。有人想要一个模式匹配的过程工具,例如pkill和pgrep。我不知道它是由procps开发人员开发还是后来添加。无论如何,它都成为了其中的一部分并成为了* nixes的一部分。

更多来源:


1
嗯-有一个killall(旧的)Solaris系统,但是它的行为有所不同。它杀死了一切。
belacqua

6
@manish-嗯,SysV系统上有一个不同的killall。
belacqua

1
@djeikyb关于killall更安全的想法听起来是正确的,或者至少这可以解释其流行的很多原因。
belacqua

5
@Manish:pkill(不杀死)不需要pid号,也不需要进程名称。它确实与进程名称匹配。
哈维尔·里维拉,

3
killall is safer for users to blindly copy and paste,除非您使用的是killall确实会杀死所有设备的计算机。不幸的是,两个不同的实用程序具有相同的名称。
Lie Ryan

7

请注意“ killall”。在某些系统上(我忘记了哪个),killall杀死所有进程。它将默默地忽略参数,并使您的系统完全停止。


5
这不是真的。不带任何参数的killall将不执行任何操作,并且killall不会忽略该参数。 kill -9 -1可能会杀死您的系统,也killall -9 -1可能会终止。不仅如此killall [program]
托马斯·沃德

6
正如在原始问题中提到的那样,在SysV系统上是正确的。
alanc

3

如果您激活/ etc / bash_completion,则单击killall <part_of_process_name>并点击选项卡-自动从正在运行的进程列表中完成进程名称


2
pgrep / pkill将完成相同的自动完成。我通常会做的事情是pkill plug<tab>,当我知道我暂时不想使用任何东西,但仍然想积极使用firefox时,将它杀死为firefox的Flash插件。这是shell的功能,而不是killall和pgrep / pkill之间的区别。
Arcege 2011年

1
我没说有什么区别-只是一个不错的功能,可以避免搜索PID,进程名称等
jet

2

如果您查看这两个程序上的选项,您会发现它们都在做同一件事,但是方式不同。

pkill将对进程的各种属性(CMD,PID,PPID,UID ...)执行匹配,并将给定的信号发送到匹配的每个进程。(对于CMD,使用正则表达式,对于其他则为字符串)。pkill不是交互式的,但是对于批处理程序更好。

killall将对进程名称(comm)或用户(user)执行匹配,而不是对整个命令字符串执行匹配。该参数用作简单字符串,并且必须与整个“ comm”值匹配(还有--regexp选项可以更改此值)。killall具有--interactive和--younger-than选项,而pkill没有。

还有一个来自SysV的killall5,并已移植到其他UNIX变体(据说是在Ubuntu软件包sysutils下)。这以旧的方式表现不同。通常在初始化脚本内部使用它来关闭或更改为单用户模式。


2
不,pkill也不killall应该在脚本中使用,只能交互使用,并要谨慎。
geirha 2011年
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.