关于python:停止守护进程的正确方法

proper way to stop a daemon process

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

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

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

我对这个"解决方案"的问题是第二个cron工作,它会杀死进程并启动另一个进程。它可以在它正在睡觉时被杀死但是如果守护进程正在处理被杀死的东西中间可能会发生坏事。

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

一般来说,在Python或Java中是否有标准的做法?
在未来,我可能会转向纯Python而不是Jython。

谢谢


在终止进程并通过Jython脚本接收信号之前,您可以在发送SIGKILL之前先发送SIGTERM

例如,发送一个SIGTERM,可以由脚本接收和处理,如果在指定的时间段内没有任何反应,您可以发送SIGKILL并强制终止该进程。

有关处理事件的更多信息,请参阅信号模块文档。

另外,示例可能很方便(使用atexit钩子):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/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)

取自这里。


正常的Linux类型方法是向您正在运行的长时间运行的进程发送信号。 您可以使用Python的内置信号库来处理这个问题。

http://docs.python.org/library/signal.html

因此,您可以从第二个应用程序向第一个应用程序发送SIGHUP,并根据您是否处于可以重新启动的状态在第一个应用程序中处理它。