服务器重新启动后,PID 文件在守护进程中徘徊

发布于 2024-08-19 07:00:11 字数 221 浏览 17 评论 0原文

我有一些守护进程使用 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

云淡风轻 2024-08-26 07:00:11

在你的pidfile上使用flock(或lockf),如果成功,你可以重写pidfile并继续。

这个答案有一个很好的例子说明了如何做到这一点。

Use flock (or lockf) 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.

躲猫猫 2024-08-26 07:00:11

这不是一个直接的解决方案,但最好在启动时检查 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.

揽清风入怀 2024-08-26 07:00:11

请记住,在向所有进程发送 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

因此,如果您不够快,要么增加延迟,要么确保您更快!

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:

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

So if you are not fast enough, either increase the delay, or make sure you are faster!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文