0

デーモンとして実行するJythonスクリプトがあります。起動し、サーバーにログインしてから、処理するものをチェックして処理し、5秒間スリープするループに入ります。

プロセスが実行されていることを確認するために5分ごとにチェックし、実行されていない場合は再開するcronジョブがあります。

私には別のcronジョブがあり、1日1回、何があってもプロセスを再開します。これを行うのは、サーバーへのデーモンの接続が失敗することがあり、これがいつ発生したかを知る方法がないためです。

この「解決策」で私が抱えている問題は、プロセスを強制終了して別のプロセスを開始する2番目のcronジョブです。スリープ中に殺されても大丈夫ですが、デーモンが殺されたときに処理の途中であると、悪いことが起こる可能性があります。

デーモンプロセスを単に強制終了するのではなく、停止する適切な方法は何ですか?

これについては、一般的に、Pythonで、またはJavaで標準的な方法がありますか?将来的には、Jythonではなく純粋なPythonに移行する可能性があります。

ありがとう

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

したがって、2 番目のアプリから 1 番目のアプリに SIGHUP を送信し、再起動しても問題ない状態にあるかどうかに基づいて、最初のアプリで処理できます。

于 2012-05-11T14:20:06.143 に答える