我正在尝试为应用程序编写服务脚本。因此我可以像这样控制它:
./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/。