正确的方法来停止守护进程

时间:2012-05-11 14:13:10

标签: python process daemon

我有一个Jython脚本,我作为守护进程运行。它启动,登录到服务器,然后进入循环,检查要处理的事情,处理它们,然后睡5秒钟。

我有一个cron作业,每5分钟检查一次,以确保进程正在运行,如果没有则再次启动。

我有另一个cron工作,无论如何每天重启一次。我们这样做是因为有时守护程序与服务器的连接有时会被搞砸,并且无法确定何时发生这种情况。

我遇到的问题"解决方案"是第二个cron工作,杀死进程并启动另一个。如果它在睡觉时被杀死就可以了,但如果守护进程处于死亡状态时处理的话可能会发生不好的事情。

停止守护程序进程的正确方法是什么?而不仅仅是杀死它?

对于一般情况,Python或Java,是否有标准做法? 将来我可能会转而使用纯Python而不是Jython。

由于

2 个答案:

答案 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,并根据您是否处于可以重新启动的状态在第一个应用程序中处理它。