2011-01-31 3 views
2

私は、プライマリマシンとセカンダリマシンの間で同期ファイルシステムを実装するために、単純なファイル同期デーモンをPythonで作成しています。重い持ち上げのほとんどはrsyncによって行われます。デーモンのSIGHUPシグナルの余波を処理するためにPython例外を使用できますか?

プライマリ側では定期的にrsyncを呼び出して、数秒間スリープしてから繰り返します。セカンダリ側では、subprocess.Popen()でrsyncdを生成し、終了するまで.wait()を実行します。しかし、私はSIGHUPを使ってデーモンの再設定を開始したいと思っています。私は、クリーンアップを処理する最良の方法が何であるか疑問に思っています。私が手しかし

rsync_args = [rsync_binary, "--daemon", "--no-detach", "--config=%s" % (config.name) ] 
p = subprocess.Popen(rsync_args) 
try: 
    p.wait() 
    if p.returncode != 0: 
     print "failed to spawn rsyncd" 
     return False 
except fsync_config_exception: 
    print "spawn_and_monitor_rsyncd: config exceptions" 
except: 
    (type, value, tb) = sys.exc_info() 
    print "we got %s with %s instead" % (type, value) 

def signal_handler(signum, frame): 
    raise fsync_config_exception 

そして:

私の最初の考えは、シグナルハンドラは、クリーンアップをトリガすることができます例外を発生持っていた

we got <type 'exceptions.TypeError'> with __init__() takes exactly 2 arguments (1 given) instead 
予期しないfsync_config_exceptionの代わりに

この種の問題に対する最善のアプローチの提案は誰にもありますか?私は、シグナルコンテクストから例外を呼び出そうと、例外を酷く酷使しているのですか?

+0

申し訳SIGHUPに応じて、何をする必要があるかんが(SIGHUPを受信した場合には注目に状態変数に追加のチェックで)信号によって殺された電子いる場合ではないだろうp.communicate()がよろしいですか? –

答えて

2

クラスではなくfsync_config_exceptionインスタンスを呼び出す必要があります。 (__init__()署名を使用してインスタンス化する)

しかし、私はそのように非同期例外を発生させることはお勧めしません。例外が適切に処理された場合にのみ例外が発生することを保証するのは苦労します。また、PythonインタープリタのコンテキストでCの拡張モジュールの呼び出しを中断することができないので、慣れ親しんだ良いパターンではありません。(しかし、それはあなたにとっては問題ではないかもしれません)

シグナルハンドラでは、 - 特別なクリーンアップがシグナルハンドラでオーダー

  • であればマーキングのためにこれを使用

    • セット状態現在の反復は中断されたことは注目に:(詳細と、これはあなたのケースのために正しいかどうか知らないがオーバー光沢)あなたが待っているプロセスをkillしてください。
    • wait to seの後に別の条件チェックを追加してくださいプロセスが
    • は、あなたが尋ねるために
  • +0

    デーモンはかなりシンプルで(約200行)、C拡張を呼び出すことはありません。しかし、例外の濫用に同意しても、それをよりきれいにすることはできませんでした。最後に、シグナルが到着する前にプロセスが停止した場合、レースを処理するシグナルハンドラでのkillの周りのtry/exceptをラップして、プロセスをグローバルにしました。 – stsquad

    関連する問題