问题描述
在Unix系统上使用简单的kill <some_pid>
多年后,我从一位年轻的Linux-savvy co-worker同事身上学到了pkill
1。
通过slow-downs和比赛条件,我很快接受了Linux-way,pgrep
-ing和pkill
-许多日夜。这一切都很好。
但现在除了killall
,我什么也看不到。 How-to似乎只提到killall
,我不确定这是否是某种并行开发,或者killall
是pkill
的继任者,还是其他。
它似乎是一个更有针对性的pkill
,但我相信我错过了一些东西。
Ubuntu /Debian-savvy2人员可以解释何时(或为什么)应该使用killall
,特别是如果它应该优先于pkill
使用(当pkill
通常看起来更容易时,因为我可以使用名称匹配,至少默认)。
在谈到killall
时,我并没有想到在某些Unix系统(Solaris,AIX,?)会终止所有用户进程的命令。以下是来自a manpage for IBM’s AIX的该版本的说明:
The killall command cancels all processes that you started, except those producing the killall process. This command provides a convenient means of canceling all processes created by the shell that you control. When started by a root user, the killall command cancels all cancellable processes except those processes that started it. If several Signals are specified, only the last one is effective.
1 ‘colleague’是从’co-worker’免费升级,所以不妨。 2原来我以为这是一个Linux或Debian的东西,但有些消息来源说Linux killall
是从BSD-flavored Unix派生的。
最佳解决方法
我想你会在how-to中看到killall,因为默认情况下它需要精确的进程名称,而pkill执行基本的模式匹配。因此,对于用户盲目复制和粘贴,killall更安全。
Pkill和killall都有不同的选择。 Killall有一个符合进程时间的标志,pkill有一个标志只会杀死给定tty上的进程。等等等等。两者都不是更好,他们只是有不同的专业。
我从他们的手册中看到,killall来自psmisc package,它有几个进程管理实用程序,但显然不包含ps
。这是procps package,它有ps,top,kill和pkill(等等)。我打赌procps本来没有pkill,所以psmisc抓了一个痒,并提出了killall。
pkill/pgrep man page表示它们是在Solaris 7中引入的。如您所说,jgbelacqua,Solaris的killall不是psmisc提供的实用程序,因此Solaris可能只有procps软件包。有人想要一个模式匹配处理工具,因此pkill和pgrep。无论是由procps dev开发还是事后添加,我都不知道。无论如何,它已经成为并且成为了所有地方的一部分。
更多来源:
次佳解决方法
请注意”killall”。在某些系统上(我忘记了),killall杀死所有进程。它会默默无视论点,并让你的系统完全停止。
第三种解决方法
如果激活/etc /bash_completion,在killall <part_of_process_name>
和hit tab – auto之后,从正在运行的进程列表中完成进程名称
第四种方法
如果你看看这两个程序的选项,你会发现它们都以同样的方式做,但方式不同。
pkill将在进程的各种属性(CMD,PID,PPID,UID …)上执行匹配,并将给定信号发送到每个匹配的进程。 (对于CMD,使用正则表达式,对于其他字符串则为字符串)。 pkill不是交互式的,但对批处理程序更好。
killall将在进程名称(comm)或用户(user)上执行匹配,而不是在整个命令字符串上。该参数用作一个简单的字符串,并且必须与整个’comm’值相匹配(还有一个–regexp选项可以更改此值)。 killall有–interactive和–younger-than选项,pkill没有。
还有一个来自SysV天的killall5被移植到其他UNIX变种(据说在Ubuntu包’sysutils’下)。这在旧时尚方式中表现不同。这在init脚本内部经常用于关闭或更改为single-user模式。