この例に従って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
それを呼び出します)。しかし、私は何がこれを引き起こしているのか見当がつかない