在我的系统/run
目录中,我有一堆具有*.pid
扩展名的文件,并存储正在运行的守护进程的进程 ID,即
% ls -1 /run/*.pid
acpid.pid
crond.pid
dhclient-wlp2s0.pid
irqbalance.pid
lightdm.pid
nginx.pid
rsyslogd.pid
我通常注意到这是许多其他守护进程所做的事情,并且守护进程管理脚本/etc/init.d/*
将从上次运行的实例中读取 pid,并在启动新实例时重用它。
为什么?为什么不直接启动守护进程并给它一个新的 pid 呢?
是否有其他程序(例如 rsyslog)期望该守护进程具有该标识符,并且如果其他程序正在使用该 pid,则会感到困惑?
答案1
对于许多守护程序,任何时候系统上只应运行该守护程序的一个实例。在此用例中,守护进程通常将其 PID 存储在众所周知的目录中(在 Linux 上,当前/run
、以前/var/run
)以指示守护进程的实例正在运行。
如果您尝试调用此类守护程序的第二个实例,新调用的守护程序将检查现有条目(将其视为锁定文件),/run
如果找到则退出。
如果守护进程重新启动,则新实例的 PID 将写入该文件。新实例有自己的 PID,无法使用给定的 PID 启动进程。
PID 文件还用于确定要终止哪个进程来停止守护进程。