我对命令很熟悉kill
,大多数时候我们只是用来kill -9
强行杀死一个进程,还有很多其他信号可以与 一起使用kill
。但我想知道如果已经有一个kill命令,pkill
and的用例是什么。killall
在其实施中执行pkill
并killall
使用该命令?kill
我的意思是它们只是包装器kill
还是有自己的实现?
我还想知道pgrep
命令如何从进程名称获取进程ID。
所有这些命令都使用相同的底层系统调用吗?从性能的角度来看有什么区别,哪个更快?
答案1
该kill
命令是一个非常简单的包装kill
系统调用,它只知道进程 ID (PID)。pkill
并且killall
也是包装kill
系统调用,(实际上是直接调用系统调用的 libc 库),但可以根据进程名称、进程所有者、会话 ID 等信息来确定 PID。
可以通过使用或在它们上看到如何pkill
和工作。在 Linux 上,它们都读取文件系统,并且对于找到的每个 pid(目录),以通过名称或其他属性识别进程的方式遍历路径。从技术上讲,这是如何完成的,是特定于内核和系统的。一般来说,他们从中读取包含命令名称作为第二个字段的内容。查找并检查每个 PID 的 proc 条目的条目。killall
ltrace
strace
/proc
/proc/<PID>/stat
pkill -f
pgrep
/cmdline
pkill
并pgrep
使用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