我有一些使用PID文件的守护进程来阻止程序的并行执行。我已经设置了一个信号处理程序来捕获SIGTERM并进行必要的清理,包括PID文件。当我使用“kill -s SIGTERM #PID”进行测试时,这非常有用。但是,当我重新启动服务器时,PID文件仍然会挂起,以防止启动后台程序。据我所知,当服务器关闭时,SIGTERM会被发送到所有进程。我应该在守护进程中捕获另一个信号(SIGINT,SIGQUIT?)吗?
答案 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
因此,如果你不够快,要么增加延迟,要么确保你更快!