1

この例に従ってpython デーモンを実装しましたが、多少は機能しているように見えますが、再構成関数のみが呼び出されます。

これは私が使用しているコードです:

import signal
import daemon
import lockfile

import manager

context = daemon.DaemonContext(
    working_directory='/home/debian/station',
    pidfile=lockfile.FileLock('/var/run/station.pid'))

context.signal_map = {
    signal.SIGTERM: manager.Manager.program_terminate,
    signal.SIGHUP: 'terminate',
    signal.SIGUSR1: manager.Manager.program_reload_configuration,
    }

manager.Manager.program_configure()

with context:
    manager.Manager.program_start()

これは、マネージャー クラスのコードです。

@staticmethod
def program_configure():
    logging.info('Configuring program')

@staticmethod
def program_reload_configuration():
    logging.info('Reloading configuration')

@staticmethod
def program_start():
    global Instance
    logging.info('Program started')
    Instance = Manager()
    Instance.run()

@staticmethod
def program_terminate():
    logging.info('Terminating')

そして、ログには次のみが表示されます。

INFO:root:Configuring program

なぜかprogram_start()呼ばれない。 program_configure()Pythonファイルが読み込まれるたびに呼び出されるので、それだけですが、なぜprogram_start()呼び出されないのですか?

次のように入力してデーモンを起動しますsudo service station.sh start。スクリプトを実行する行は次のとおりです。

python $DAEMON start

編集:少し読んだ後、プログラムがおそらく終了するかハングインすることに気付きましたcontext.__enter__()(withそれを呼び出します)。しかし、私は何がこれを引き起こしているのか見当がつかない

4

1 に答える 1

0

問題は、関数を呼び出さない python-daemon ではなく、機能しなかったログです。

デーモンが新しいプロセスを作成するとき、すべてのファイル ハンドルをマザー プロセスから転送するわけではありません。したがって、ログは書き込まれません。詳細については、この質問を参照してください。

その解決策は、次のfiles_preserveようにプロパティを使用することです。

# Set the logger
LOG_LEVEL = logging.DEBUG
logger = logging.getLogger()
logger.setLevel(LOG_LEVEL)
fh = logging.FileHandler(LOG_FILENAME)
logger.addHandler(fh)

# Not create the context, and notify it to preserve the log file
context = daemon.DaemonContext(
    working_directory='/home/debian/station',
    pidfile=lockfile.FileLock('/var/run/station.pid'),
    files_preserve=[fh.stream],
)
于 2016-03-24T10:48:49.007 に答える