我有一个Jython脚本,我作为守护进程运行。它启动,登录到服务器,然后进入循环,检查要处理的事情,处理它们,然后睡5秒钟。
我有一个cron作业,每5分钟检查一次,以确保进程正在运行,如果没有则再次启动。
我有另一个cron工作,无论如何每天重启一次。我们这样做是因为有时守护程序与服务器的连接有时会被搞砸,并且无法确定何时发生这种情况。
我遇到的问题"解决方案"是第二个cron工作,杀死进程并启动另一个。如果它在睡觉时被杀死就可以了,但如果守护进程处于死亡状态时处理的话可能会发生不好的事情。
停止守护程序进程的正确方法是什么?而不仅仅是杀死它?
对于一般情况,Python或Java,是否有标准做法? 将来我可能会转而使用纯Python而不是Jython。
由于
答案 0 :(得分:1)
在终止进程并通过Jython脚本接收信号之前,您可以在发送SIGTERM
之前先发送SIGKILL
。
例如,发送一个SIGTERM
,可以由您的脚本接收和处理,如果在指定的时间段内没有任何反应,您可以发送SIGKILL
并强制终止该过程。
有关处理事件的更多信息,请参阅signal模块文档。
此外,示例可能很方便(使用atexit
挂钩):
#!/usr/bin/env python
from signal import signal, SIGTERM
from sys import exit
import atexit
def cleanup():
print "Cleanup"
if __name__ == "__main__":
from time import sleep
atexit.register(cleanup)
# Normal exit when killed
signal(SIGTERM, lambda signum, stack_frame: exit(1))
sleep(10)
取自here。
答案 1 :(得分:0)
正常的Linux类型方法是向您正在运行的长时间运行的进程发送信号。您可以使用Python的内置信号库来处理这个问题。
http://docs.python.org/library/signal.html
因此,您可以从第二个应用程序向第一个应用程序发送SIGHUP,并根据您是否处于可以重新启动的状态在第一个应用程序中处理它。