为什么守护进程将其 PID(进程 ID)存储在文件中?

为什么守护进程将其 PID(进程 ID)存储在文件中?

在我的系统/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 文件还用于确定要终止哪个进程来停止守护进程。

相关内容