如何正确处理服务脚本中 pid.file 的删除

如何正确处理服务脚本中 pid.file 的删除

我正在尝试为应用程序编写服务脚本。因此我可以像这样控制它:

./myscript.sh start|stop|status

启动时pid.file会创建进程 ID,基于此我可以检查状态并停止进程。在停止命令中我删除了pid.file- 没问题。

但是如果应用程序以异常方式崩溃 - 关闭电源等,则pid.file无法删除,我需要手动将其删除。

脚本中该如何正确处理这种异常情况?

答案1

您可以验证 pid 是否正在运行并且属于您的应用程序:

pid=$(< "$pidfile")   # a bash builtin way to say: pid=$(cat $pidfile)
if  kill -0 $pid &&
    [[ -r /proc/$pid/cmdline ]] && # find the command line of this process
    xargs -0l echo < /proc/$pid/cmdline | grep -q "your_program_name"
then
    # your application is running
    true
else
    # no such running process, or some other program has acquired that pid:
    # your pid file is out-of-date
    rm "$pidfile"
fi

答案2

PID 文件永远不应该被删除,除非您卸载了创建它们的软件。

PID 文件主要是为了防止同时执行。删除 PID 文件会使该目的永远失效。在取消链接 PID 文件的那一刻,任意数量的进程可能拥有该文件的打开文件描述符,并可能由操作系统获取该文件的独占锁。

@glenn_jackman 答案中的 else 分支确实应该被删除。

我已经更详细地解释了潜在的问题,包括一个用于重现由此产生的竞争条件的代码示例http://www.guido-flohr.net/never-delete-your-pid-file/

相关内容