3

Python でデーモンを作成するにはどうすればよいですか?を読みました。また、このトピック、非常に単純なデーモンを作成しようとしました:

import daemon
import time
with daemon.DaemonContext():
    while True:
        with open('a.txt', 'a') as f:
            f.write('Hi')
        time.sleep(2)

動作python script.pyし、すぐに端末に戻ります(これは予想される動作です)。しかし、a.txt書かれたことはなく、エラーメッセージも表示されません。この単純なことの何が問題になっていdaemonますか?

4

3 に答える 3

2

daemon.DaemonContext()working_directoryデフォルトのフォルト値を持つオプションがあります/。つまり、プログラムにはおそらくそこに新しいファイルを作成する権限がありません。

于 2016-01-17T20:12:42.023 に答える
0

それが間違っていることの1つは、何が問題なのかを伝える方法がないことです:-)

デーモンプロセスは、定義上、親プロセスおよび制御端末から分離されています。そのため、エラー メッセージなど、何かを伝える必要がある場合は、デーモンになる前にそれを調整する必要があります。

FAQpython-daemonドキュメントから:

デーモンコンテキストを開いた後に出力が停止するのはなぜですか?

_で指定された動作にPEP 3143は、制御端末からプロセスをデタッチする要件 (プロセスがデーモンとして実行を継続できるようにするため) と、デタッチ後に安全であることがわかっていないすべてのファイル記述子を閉じる必要があります (続行するすべてのファイルを確実にするため)。デーモンプロセスの制御下にある)。

プロセスがシステム ストリーム 'sys.stdout' および 'sys.stderr' を介して出力を生成するようにする場合は、'DaemonContext' の 'stdout' および/または 'stderr' オプションをファイルのようなオブジェクトに設定します (たとえば、 「logging.Handler」インスタンスの「ストリーム」属性)。これらのオブジェクトにファイル記述子がある場合、それらはデーモン コンテキストが開いたときに保持されます。

ログ ファイルなど、作業用の通信チャネルを設定します。オプションを使用して、開いたファイルが他のすべてのものと一緒に閉じられていないことを確認しfiles_preserveます。次に、そのチャネルにエラーを記録します。

于 2016-02-02T00:01:34.300 に答える
0

ここで説明されている問題は、JJ ハカラの回答によって解決されます。

2 つの追加 (重要) 事項:

  • Sander のコード(ここで言及) はよりも優れていpython-daemonます。より信頼性が高くなります。ほんの一例:同じデーモンを2 回python-daemon起動しようとすると、大きな醜いエラーが発生します。Sander のコードを使用すると、「Daemon already running.」という素晴らしい通知が表示されます。

  • python-daemonとにかく使いたい人向け:DaemonContext()デーモンのみを作成します。DaemonRunner()デーモン + 制御ツールを作成し、python script.py startまたはstopなどを実行できるようにします。

于 2016-01-17T21:25:01.527 に答える