我知道pkill
比 具有更多的过滤规则killall
。我的问题是,以下之间有什么区别:
pkill [signal] name
和
killall [signal] name
我读过这killall
更有效,可以杀死与name
程序匹配的所有进程和子进程(并递归地)。 pkill
也不做这个吗?
答案1
这pgrep
和pkill
Sun 的 Solaris 7 中引入了实用程序,g33klord 指出,它们采用一个模式作为参数,该模式与正在运行的进程的名称相匹配。虽然pgrep
仅打印匹配进程的列表,但pkill
会将指定的信号(或SIGTERM
默认情况下)发送到进程。当您想要小心并首先使用 来查看匹配进程的列表,然后继续使用 来终止它们时,pgrep
和之间的通用选项和语义会派上用场。并由提供pkill
pgrep
pkill
pgrep
pkill
过程包,它还提供其他/proc
文件系统实用程序,例如ps
,top
,free
,uptime
除其他外。
该killall
命令由提供杂项包,不同之处在于pkill
,默认情况下,在确定信号将发送到的进程时,它与参数名称完全匹配(最多前 15 个字符)。可以指定-e
,选项--exact
来要求长度超过 15 个字符的名称完全匹配。killall
与 . 相比,这使得使用起来更加安全pkill
。如果指定的参数包含斜杠 ( /
) 字符,则该参数将被解释为文件名,并且运行该特定文件的进程将被选为信号接收者。还通过,选项killall
支持进程名称的正则表达式匹配。-r
--regexp
还有其他差异。killall
例如,该命令具有按年龄( -o
、--older-than
和-y
、--younger-than
)匹配进程的选项,同时pkill
可以被告知仅终止特定终端上的进程(通过该-t
选项)。显然,这两个命令都有特定的定位。
请注意,killall
对系统后代的命令Unix系统V(尤其太阳的索拉里斯,IBM的AIX和惠普的HP-UX)杀死全部可由特定用户杀死的进程,如果由 root 运行,则有效地关闭系统。
Linux psmisc 实用程序已移植到BSD(并且在扩展中Mac OS X),因此killall
遵循“按名称杀死进程”语义。
答案2
pkill
是值得教导后代的,既因为您提到的过滤器,又因为它与高度可重用的pgrep
.它们以相同的方式终止进程,并且都不以递归方式终止 - 尽管使用pgrep
,您可以按会话(每个 tty,想想 setid)或进程组(想想作业控制)进行选择。
答案3
答案4
我刚才发现的一个区别是pkill -u
接受 uid。但killall -u
将 uid 视为用户名。
> killall -u 13081
Cannot find user 13081