服务器重启后,PID文件挂在守护进程中

时间:2010-01-25 18:53:54

标签: python linux sigterm

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

3 个答案:

答案 0 :(得分:3)

不是直接解决方案,但在启动时检查pid文件中pid运行的实际进程并且如果不存在则清理过时文件可能是个好主意。

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

答案 1 :(得分:3)

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

This SO answer就如何做到这一点有一个很好的例子。

答案 2 :(得分: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

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