服务器重启后守护进程的PID文件留存

3 投票
3 回答
884 浏览
提问于 2025-04-15 18:27

我有一些后台程序,它们使用PID文件来防止我的程序同时运行。我设置了一个信号处理器来捕捉SIGTERM信号,并进行必要的清理工作,包括删除PID文件。当我用“kill -s SIGTERM #PID”来测试时,这一切都运行得很好。然而,当我重启服务器时,PID文件仍然存在,这就阻止了后台程序的启动。我了解到,当服务器关闭时,SIGTERM信号会发送给所有进程。我是不是应该在我的后台程序中捕捉其他信号(比如SIGINT或SIGQUIT)呢?

3 个回答

2

记住,当你向所有进程发送SIGTERM信号后,系统内核会等一段时间(通常大约2到3秒),然后再发送SIGKILL信号。你可以在/etc/rc.d/rc0.d/S01halt或者类似的文件中找到这个设置(具体位置可能根据你的操作系统版本有所不同)。

举个例子,在我的Fedora 11系统中,你会看到:

action $"Sending all processes the TERM signal..." /sbin/killall5 -15
sleep 2
action $"Sending all processes the KILL signal..."  /sbin/killall5 -9

所以,如果你反应不够快,要么就增加这个等待时间,要么就确保你能更快一些!

3

这不是一个直接的解决办法,但在启动时检查一下pid文件里记录的进程是否真的在运行,假如没有找到这个进程,可以考虑删除这个过期的文件,这可能是个好主意。

有可能你的进程在有机会清理pid文件之前就收到了一个叫SIGKILL的信号,导致它无法完成清理工作。

4

在你的进程ID文件上使用 flock(或者 lockf),如果成功了,你就可以重新写这个进程ID文件,然后继续进行。

这个StackOverflow的回答提供了一个很好的示例,展示了怎么做到这一点。

撰写回答