我正在研究一个 nagios 插件,我发现了这段代码:
killall -0 $1
我试过了,它为正在运行的进程返回了 0
,但它并没有终止进程。
请解释这个0
值的含义以及它没有终止进程的原因。
最佳答案
来自 man 2 kill
:
If sig is 0, then no signal is sent, but error checking is still performed; this can be used to check for the existence of a process ID or process group ID.
kill(2)
成功时返回 0
,否则返回 -1
。因此,对于零信号,假设进程有足够的权限向目标进程发送信号,如果进程或进程组 ID 存在则返回 0
,否则返回 - 1
(并将 errno
设置为 ESRCH
)。请注意,手册页只是说明仍然执行错误检查,因此它将返回 -1
并将 errno
设置为 EPERM
如果目标进程存在但发送进程没有足够的权限向它发送信号。
killall(1)
和 kill(1)
命令实用程序的行为相似,因为它们在后台使用了 kill(2)
。
请注意,程序代码不应该依赖于此来根据进程的存在做出决定:在检查进程是否存在和使用进程可能终止的信息之间总是有一个时间窗口(并且可能是一个新的,不相关的进程在该时间窗口启动,并且回收和使用相同的 PID)。
关于linux - 什么是零信号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32259228/