Kill 、 pkill 和 Killall 和有什么区别?

Kill 、 pkill 和 Killall 和有什么区别?

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

在其实施中执行pkillkillall使用该命令?kill我的意思是它们只是包装器kill还是有自己的实现?

我还想知道pgrep命令如何从进程名称获取进程ID。

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

答案1

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

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

pkillpgrep使用readproc系统调用,反之killall则不使用。我不能说是否存在性能差异:您必须自己进行基准测试。

答案2

更实际的答案:

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

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

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

答案3

Kill 和 Killall 是提供终止进程的方法的工具。第一个是其 PID,第二个是其名称。 pgrep(列表)和 pkill(默认为终止)是提供一种通过进程名称或其他属性向进程发送消息的方法的工具,请参阅:http://linux.die.net/man/1/pkill 有关信号的更多信息:http://linux.die.net/man/7/signal

相关内容