首页 文章

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

提问于
浏览
3

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

3 回答

  • 3

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

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

  • 3

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

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

  • 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
    

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

相关问题