kill 、 pkill 和 killall 有什么区别?

Ija*_*han 55 linux bash kill shell-script

我对killcommand很熟悉,大多数时候我们只是用来kill -9强行杀死一个进程,还有很多其他信号可以与kill. 但我想知道pkilland的用例是什么killall,如果已经有一个 kill 命令。

在他们的实现中做pkillkillall使用kill命令吗?我的意思是他们只是包装器,kill或者他们有自己的实现?

我还想知道pgrepcommand如何从进程名称中获取进程 ID。

所有这些命令都使用相同的底层系统调用吗?从性能的角度来看有什么区别,哪个更快?

Oth*_*eus 52

kill命令是kill 系统调用的一个非常简单的包装器,它只知道进程 ID (PID)。pkill并且killall也是kill 系统调用的包装器(实际上是直接调用系统调用的 libc 库),但可以根据进程名称、进程所有者、会话 ID 等为您确定 PID。

使用或使用它们可以看到如何pkillkillall工作。在 Linux 上,它们都通读文件系统,并且对于找到的每个 pid(目录),以某种方式遍历路径以通过名称或其他属性识别进程。从技术上讲,这是如何完成的,特定于内核和系统。通常,他们从中读取包含命令名称作为第二个字段的内容。对于并检查每个 PID 的 proc 条目的条目。ltracestrace/proc/proc/<PID>/statpkill -fpgrep/cmdline

pkillpgrep使用readproc系统调用,而killall没有。我不能说是否存在性能差异:您必须自行对其进行基准测试。


fny*_*fny 8

更实际的答案:

  • kill将为给定进程ID(例如10341)向操作系统发送SIGTERM(终止进程)信号,默认情况下这是SIGTERM。您实际上也可以指定其他信号(例如 -9 强制终止)

  • killall将向所有与某个名称完全匹配的进程发送 SIGTERM。它还带有其他好处,例如按用户进行子集化。

  • pkill将向所有匹配给定模式的进程发送 SIGTERM。它在底层使用了 pgrep。