服务器重新启动后,PID 文件在守护进程中徘徊
我有一些守护进程使用 PID 文件来阻止我的程序的并行执行。我已经设置了一个信号处理程序来捕获 SIGTERM 并进行必要的清理,包括 PID 文件。当我使用“kill -s SIGTERM #PID”进行测试时,这非常有效。然而,当我重新启动服务器时,PID 文件仍然存在,阻止守护进程启动。据我了解,当服务器关闭时,SIGTERM 会发送到所有进程。我应该在我的守护进程中捕获另一个信号(SIGINT、SIGQUIT?)吗?
I have some daemons that use PID files to prevent parallel execution of my program. I have set up a signal handler to trap SIGTERM and do the necessary clean-up including the PID file. This works great when I test using "kill -s SIGTERM #PID". However, when I reboot the server the PID files are still hanging around preventing start-up of the daemons. It is my understanding that SIGTERM is sent to all processes when a server is shutting down. Should I be trapping another signal (SIGINT, SIGQUIT?) in my daemon?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
在你的pidfile上使用
flock
(或lockf
),如果成功,你可以重写pidfile并继续。这个答案有一个很好的例子说明了如何做到这一点。
Use
flock
(orlockf
) on your pidfile, if it succeeds, you can rewrite the pidfile and continue.This SO answer has a good example on how this is done.
这不是一个直接的解决方案,但最好在启动时检查 pid 文件中是否有实际运行的进程,如果不存在,则清理过时的文件。
您的进程可能在有机会清理 pid 文件之前就收到了 SIGKILL。
Not a direct solution but it might be a good idea to check for an actual process running with the pid in the pid file at startup and if none exists, to cleanup the stale file.
It's possible that your process is getting a SIGKILL before it has a chance to cleanup the pid file.
请记住,在向所有进程发送 SIGTERM 后,内核会等待一段时间(通常大约 2 或 3 秒),然后发送 SIGKILL。您可以在
/etc/rc.d/rc0.d/S01halt
或类似文件中找到它(可能会根据您的发行版而有所不同)。例如,在我的 Fedora 11 上,您有:
因此,如果您不够快,要么增加延迟,要么确保您更快!
Remember that, after sending SIGTERM to all processes, the kernel wait some time (usually about 2 or 3 seconds), and then send SIGKILL. You can find that in
/etc/rc.d/rc0.d/S01halt
or similar (might vary depending on your distribution).For example, on my Fedora 11 you have:
So if you are not fast enough, either increase the delay, or make sure you are faster!