0

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

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

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

我对这个“解决方案”的问题是第二个 cron 作业终止了进程并启动了另一个进程。如果它在睡眠时被杀死是可以的,但是如果守护进程在它被杀死时正在处理事情,那么可能会发生不好的事情。

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

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

谢谢

4

2 回答 2

1

您可以在终止进程并通过 Jython 脚本接收信号时SIGTERM在发送之前发送第一个。SIGKILL

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

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

此外,可能很方便的示例(使用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)

取自这里

于 2012-05-11T14:16:12.713 回答
0

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

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

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

于 2012-05-11T14:20:06.143 回答