2016-03-23 9 views
0

Ich habe die this example verfolgt, um einen Python-Daemon zu implementieren, und es scheint etwas zu arbeiten, aber nur die Rekonfigurationsfunktion aufgerufen wird.Python-Daemon ruft nicht die Startfunktion

Dies ist der Code, den ich verwendet habe:

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() 

Dies ist der Code auf der Manager-Klasse:

@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') 

und das Protokoll zeigt nur:

INFO:root:Configuring program 

Aus irgendeinem Grund wird program_start() nicht aufgerufen. program_configure() wird jedes Mal aufgerufen, wenn die Python-Datei gelesen wird, also das ist, aber warum wird nicht program_start() aufgerufen?

beginne ich den Dämon durch sudo service station.sh start eingeben und die Linie, die das Skript ausgeführt ist:

python $DAEMON start 

EDIT: Nach ein bisschen lesen, ich habe erkannt, dass das Programm wahrscheinlich verlässt oder hängt in context.__enter__() (with nennt das). Aber ich habe keine Ahnung, was das verursacht

+1

auf Ihrer beenden Sie die fn anrufen: Sie den Satz von Pars haben(), anstatt nur die Adresse geben (in Ihrem Signal Map Setup) – pyInTheSky

+0

Sie haben Recht! das behoben und die Frage bearbeitet. Vielen Dank! – Nitay

Antwort

0

Das Problem war nicht im Python-Daemon nicht die Funktionen aufrufen, es ist die Protokollierung, die nicht funktioniert hat.

Wenn der Daemon einen neuen Prozess erstellt, überträgt er nicht alle Datei-Handles vom Mutterprozess - Daher werden die Protokolle nicht geschrieben. Weitere Informationen finden Sie unter this question.

Die Lösung, die wie so die files_preserve Eigenschaft zu verwenden ist:

# 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], 
)