我熟悉kill
命令,大多数时候我们只使用kill -9强制杀死一个进程,还有很多其他的信号可以使用kill
。但是我不知道pkill
and 的用例是什么killall
,如果已经有kill命令。
这样做pkill
并killall
使用kill
在执行命令?我的意思是说,它们只是包装器kill
还是它们自己的实现?
我也想知道pgrep
命令如何从进程名称中获取进程ID。
所有这些命令都使用相同的基础系统调用吗?从性能角度来看,哪个更快?
我熟悉kill
命令,大多数时候我们只使用kill -9强制杀死一个进程,还有很多其他的信号可以使用kill
。但是我不知道pkill
and 的用例是什么killall
,如果已经有kill命令。
这样做pkill
并killall
使用kill
在执行命令?我的意思是说,它们只是包装器kill
还是它们自己的实现?
我也想知道pgrep
命令如何从进程名称中获取进程ID。
所有这些命令都使用相同的基础系统调用吗?从性能角度来看,哪个更快?
Answers:
该kill
命令是kill
系统调用的非常简单的包装器,该系统调用仅知道进程ID(PID)。pkill
并且killall
也是kill
系统调用(实际上是直接调用系统调用的libc库)的包装,但可以根据诸如进程名称,进程所有者,会话ID等之类的信息为您确定PID。
如何pkill
与killall
工作可使用可见ltrace
或strace
他们。在Linux上,它们都读取/proc
文件系统,并为找到的每个pid(目录)遍历路径,从而通过其名称或其他属性来标识进程。从技术上讲,这是如何完成的,具体取决于内核和系统。通常,他们从中读取/proc/<PID>/stat
包含命令名称的第二字段。对于pkill -f
并pgrep
检查/cmdline
每个PID的proc条目的条目。
pkill
并pgrep
使用readproc
系统调用,而killall
不会。我不能说是否存在性能差异:您必须自己对它进行基准测试。
kill和killall是提供一种杀死进程的工具。第一个通过其PID,第二个通过其名称。pgrep(列表)和pkill(默认情况下为kill)是提供通过其名称或其他属性向进程发送消息的方法的工具,请参见:http : //linux.die.net/man/1/pkill 有关更多信息信号:http : //linux.die.net/man/7/signal
killall
用来杀死进程吗?它为此使用pgrep?并killall
杀死所有子进程,?killall
默认情况下使用什么信号?
killall
将杀死您有权杀死的所有进程,因此,如果您是root用户,则可以有效地重新引导服务器。
killall chromium
会杀死铬的过程,pgrep chromium
会给你PID列表,pkill chromium
会杀死铬。killall将默认发送SIGTERM信号(作为pkill)
kill -9
默认使用?-15(请停止)和-1(调制解调器已挂断,请彻底关闭自己)的礼貌得多。其次。当心在非Linux机器上使用killall。它的行为可能有所不同。(例如,在solaris上,它会杀死所有进程。在进程名上未过滤)。