2012-05-11 7 views
0

私はデーモンとして実行するJythonスクリプトを持っています。起動し、サーバーにログインし、処理するものをチェックし、処理してから5秒間スリープするループに入ります。デーモンプロセスを停止する適切な方法

5分ごとにプロセスが実行されていることを確認し、そうでない場合は再び起動するcronジョブがあります。

私は別のcronジョブを持っていますが、1日に一度プロセスを再起動します。これは、デーモンとサーバとの接続が時には不正になることがあり、これがいつ起きるかを知る方法がないためです。

この「解決策」で私が持っている問題は、プロセスを強制終了して別のプロセスを開始する2番目のcronジョブです。死んでいる間に殺されたら大丈夫ですが、殺されたときにデーモンが処理中であれば悪いことが起こるかもしれません。

デーモンプロセスを停止する適切な方法は何ですか。ただそれを殺すのではなく、何ですか?

これは一般的に、PythonまたはJavaで標準的な方法ですか? 将来、私はJythonではなく純粋なPythonに移行するかもしれません。

おかげ

+0

「デーモンのサーバーへの接続が時折戸惑う」とはどういう意味ですか? – Jordan

答えて

1

あなたが最初のプロセスを終了し、Jythonスクリプトによる信号を受信したときSIGKILLを送信する前にSIGTERMを送ることができます。

たとえば、スクリプトで受信して処理できるSIGTERMを送信し、指定した期間内に何も起こらない場合は、SIGKILLを送信して強制的にプロセスを強制終了できます。

イベントの処理の詳細については、signalモジュールのマニュアルを参照してください。また

、(atexitフックを使用して)便利であってもよい。例:hereから撮影

#!/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) 

+0

ありがとう...これはJythonからも機能します。 –

0

これを実行する通常のLinuxタイプの方法は、長時間実行されているプロセスに信号を送信することです。これは、Pythonの組み込みシグナルライブラリで処理できます。

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

だから、あなたはそれを再起動するためにOKだ状態にしているかどうかに基づいて、第二のアプリからあなたの第一アプリにSIGHUPを送信し、最初にそれを処理することができます。

+0

ありがとう! petrの例は "うまくいく"とは言えますが、問題に遭遇した場合、または退屈になった場合はそのドキュメントを参照します;-) –

関連する問題