2016-03-23 12 views
0

私はthis exampleを実行してpythonデーモンを実装していますが、やや動作しているように見えますが、reconfigure関数だけが呼び出されます。python-daemonはstart関数を呼び出しません

これは私が使用してきたコードです:

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を入力して、デーモンを起動し、スクリプトを実行する行は次のとおりです。with(ビットを読んだ後、私はプログラムはおそらくcontext.__enter__()に終了したりハングアップすることを実現しました :

python $DAEMON start 

EDITそれを呼び出す)。しかし、私はこれを引き起こしている何かの手掛かりがありません

+1

、あなたはFNを呼び出している:あなたは、括弧のセットを(持っている)だけではなく、アドレスを与える(自分の中シグナルマップの設定) – pyInTheSky

+0

あなたはそうです!それを修正し、質問を編集しました。ありがとう! – Nitay

答えて

0

問題は、関数を呼び出さないpythonデーモンではなかった、それは動作しないログです。

デーモンが新しいプロセスを作成すると、マザープロセスからすべてのファイルハンドルが転送されないため、ログは書き込まれません。詳細はthis questionを参照してください。

それに対する解決策はそうのような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], 
) 
関連する問題