1

このコードを使用してデーモン化するPythonスクリプトがあります

        def daemonise():
            from os import fork, setsid, umask, dup2
            from sys import stdin, stdout, stderr

            if fork(): exit(0)
            umask(0) 
            setsid() 
            if fork(): exit(0)

            stdout.flush()
            stderr.flush()
            si = file('/dev/null', 'r')
            so = file('daemon-%s.out'%os.getpid(), 'a+')
            se = file('daemon-%s.err'%os.getpid(), 'a+')
            dup2(si.fileno(), stdin.fileno())
            dup2(so.fileno(), stdout.fileno())
            dup2(se.fileno(), stderr.fileno())
            print 'this file has the output from daemon%s'%os.getpid()
            print >> stderr, 'this file has the errors from daemon%s'%os.getpid()

スクリプトは

while True: try: funny_code(); sleep(10); except:pass;

ループ。数時間は正常に動作し、その後予期せず停止します。そのようなデーモン、エラーデーモンをデバッグするにはどうすればよいですか。

[編集]

monit のようなプロセスを開始せずに、Python でウォッチドッグを記述して、他のデーモンを監視し、ダウンしたときに再起動する方法はありますか? (番犬を見守る者)

4

3 に答える 3

3

これには、標準のデーモンプロセスライブラリ用にPEP 3141を実装するライブラリであるpython-daemonを実際に使用する必要があります。このようにして、アプリケーションが実行されている UNIX の種類に関係なく、アプリケーションがすべて適切に動作することを確認できます。車輪を再発明する必要はありません。

于 2009-10-23T14:27:30.523 に答える
1

なぜあなたはすべての例外を静かに飲み込んでいるのですか? これによってキャッチされている例外を確認してください。

while True:
    try:
        funny_code()
        sleep(10)
    except BaseException, e:
        print e.__class__, e.message
        pass

失敗の原因となる予期しないことが起こっている可能性がありますが、すべての例外をやみくもに無視しているかどうかはわかりません。

プロセスのデーモン化と監視には、 supervisord (Python で作成され、非常に使いやすい) を使用することをお勧めします。Supervisord の下で実行すると、daemonise関数を使用する必要がなくなります。

于 2009-10-21T16:55:25.520 に答える
0

私がクライアントで使用したのはdaemontoolsです。これは、デーモン化されたものを実行するための、実績のある十分にテストされたツールです。

フォアグラウンドで実行するには、デーモン化せずにアプリケーションを作成するだけです。次に、そのためのdaemontoolsサービスフォルダーを作成します。これにより、今後、システムが再起動するたびに、アプリケーションが検出され、自動的に再起動されます。

ログローテーションなども処理できます。面倒で繰り返しの作業を大幅に節約できます。

于 2009-10-21T10:30:29.527 に答える