‘killall’和’pkill’有什么区别?

在Unix系统上使用普通kill 多年之后,我从一位年轻的Linux同事同事那里学到了pkill 1

我很快就接受了Linux-way, pgrep -ing和pkill -ing,通过减速和竞争条件多日夜。 这一切都很好。

但是现在我只看到了killall 。 操作方法似乎只提及killall ,我不确定这是否是某种并行开发,或者如果killallpkill的inheritance者,或其他什么。

它看起来像一个更有针对性的pkill ,但我确定我错过了一些东西。

一个Ubuntu / Debian-savvy 2的人可以解释何时(或为什么)应该使用killall ,特别是如果它应该优先使用pkill (当pkill经常看起来更容易时,因为我可能比较粗略的名字匹配,至少默认情况下)。

在谈到killall ,我并没有想到在某些Unix系统(Solaris,AIX,?)上会杀死所有用户进程的命令。 以下是IBM AIX的手册页中对该版本的描述:

killall命令取消您启动的所有进程,生成killall进程的进程除外。 此命令提供了一种方便的方法来取消由您控制的shell创建的所有进程。 当root用户启动时,killall命令会取消除启动它之外的所有可取消进程。 如果指定了几个信号,则只有最后一个信号有效。

1 ‘同事’是从“同事”免费升级的,所以不妨。
2最初我认为这是Linux或Debian的事情,但有些消息来源说Linux killall来自BSD风格的Unix。

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

Pkill和killall都有不同的选择。 Killall有一个按进程年龄匹配的标志,pkill有一个标志只能杀死给定tty上的进程。 Etcetera ad nauseum。 两者都不是更好 ,他们只是有不同的专业。

我从他们的man页面看到killall来自psmisc包 ,它有几个进程管理实用程序,但值得注意的是不包含ps 。 这是包含ps,top,kill和pkill(以及其他)的procps包 。 我打赌procps原本没有pkill,所以psmisc抓了一个痒,想出了killall。

pkill / pgrep手册页说它们是在Solaris 7中引入的。正如你所提到的, jgbelacqua ,Solaris的killall不是psmisc提供的实用程序,因此Solaris可能只有procps包。 有人想要一个模式匹配处理工具,因此pkill和pgrep。 无论是由procps dev开发还是之后添加,我都不知道。 无论如何,它成为了*并且成为* nixes的一部分。

更多来源:

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

如果激活/ etc / bash_completion,则在killall 和命中选项卡后 – 自动从正在运行的进程列表中完成进程名称

如果你看看这两个程序的选项,你会看到它们都做同样的事情,但是以不同的方式。

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

killall将在进程名称(comm)或用户(用户)上执行匹配,而不是在整个命令字符串上执行匹配。 该参数用作一个简单的字符串,并且必须与整个’comm’值匹配(还有一个–regexp选项来更改它)。 killall有–interactive和–younger-than选项,pkill没有。

还有一个killall5来自SysV天,并被移植到其他UNIX变种(据说在Ubuntu包’sysutils’下)。 这在旧方式中表现不同。 这通常在内部用于init脚本以关闭或更改为单用户模式。