3

我有一些使用 PID 文件来防止我的程序并行执行的守护进程。我已经设置了一个信号处理程序来捕获 SIGTERM 并进行必要的清理,包括 PID 文件。当我使用“kill -s SIGTERM #PID”进行测试时,这非常有用。但是,当我重新启动服务器时,PID 文件仍然存在,阻止了守护程序的启动。据我了解,当服务器关闭时,SIGTERM 会发送到所有进程。我应该在我的守护进程中捕获另一个信号(SIGINT、SIGQUIT?)吗?

4

3 回答 3

4

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

这个 SO answer有一个很好的例子来说明这是如何完成的。

于 2010-01-25T19:25:23.580 回答
3

不是直接的解决方案,但最好在启动时检查 pid 文件中的 pid 运行的实际进程,如果不存在,则清理陈旧文件。

您的进程可能会在有机会清理 pid 文件之前获得 SIGKILL。

于 2010-01-25T18:57:56.577 回答
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

所以如果你不够快,要么增加延迟,要么确保你更快!

于 2010-01-25T19:12:50.127 回答