2017-05-23 3 views
0

Ich schreibe ein Skript, um ein Systemprotokoll zu lesen, und ich habe Probleme beim Daemonieren. Es wird willkürlich aufgehängt und ich kann nicht für das Leben von mir herausfinden, warum. Hier ist der Code:Python-Daemon erwischt

Daemon

daemon_context = daemon.DaemonContext(files_preserve=[fh.stream]) 
with daemon_context: 
    logger.debug("In Daemon") 
    main() 

Haupt

logger = logging.getLogger() 
logger.setLevel(logging.DEBUG) 
fh = logging.FileHandler("./debug.log") 
logger.addHandler(fh) 
logger.debug("First") 

def main(): 
    while True: 
     from schema import parsed, engine, session 
     logger.debug("Main Loop") 
     logger.debug(args) 

     if args.filename is None: 
      logger.debug("In If") 
      with open("/absolute/path/to/log.log") as f: 
       readlines = f.readlines() 
       logger.debug(readlines) 
      content = [x.split() for x in readlines] 
      logger.debug(content) 
     else: 
      logger.debug("In Else") 
      with open(args.filename) as f: 
       readlines = f.readlines() 
       logger.debug(readlines) 
      content = [x.split() for x in readlines] 
      logger.debug(content) 

     logger.debug("After Ifs") 

     conn = engine.connect() 
     logger.debug(conn) 
     rows = session.query(parsed).count() 

     for entry in range(rows, len(content)): 
     # Code inside this for loop is unimportant to the problem at hand 

Logging

ich alles bin Anmeldung als ich gehen, um herauszufinden, wo der Fehler abgefangen wird.

Wenn ich es mit python3 test.py --filename access.log laufen erhalte ich:

First 
In Daemon 
Main Loop 
Namespace(filename='access.log') 
In Else 

, dass das gesamte Protokoll ist. Es hört einfach auf.

Aber wenn ich python3 test.py laufen, ohne einen Dateinamen als Argument, dann bekomme ich dieses Protokoll:

First 
In Daemon 
Main Loop 
Namespace(filename=None) 
In If 
[] 
[] 
After Ifs 
<sqlalchemy.engine.base.Connection object at 0x7fe11c1da5f8> 

Dann ist es unendlich wiederholt, bis ich die Aufgabe zu stoppen.

Ich kann einfach nicht herausfinden, warum es aufhört. Wenn mir jemand helfen könnte, wäre das großartig. Ich hatte eine andere Form dieses Skripts, bevor ich versuchte, python-daemon zu verwenden, das funktionierte. Ich weiß also, dass die zugrunde liegende Logik vernünftig sein sollte.

+0

Wie werden Ausnahmen in 'open (args.filename)' behandelt? – VPfB

Antwort

0

Diese

daemon_context = daemon.DaemonContext(files_preserve=[fh.stream]) 
with daemon_context: 

ist nicht das gleiche wie

with daemon.DaemonContext(files_preserve=[fh.stream]) as daemon_context: 

Ich bin auch nicht sicher, ob Ihr Logger, wobei Globals, wird den Tod des Hauptprozesses während daemonization überleben. Haben Sie versucht, es innerhalb main() zu initialisieren?

+0

Wenn ich die Kontextmanager richtig verstehe, ist der einzige Unterschied zwischen den beiden der Wert der 'daemon_context' Variable innerhalb des 'with' Blocks. Aber in diesem Fall wird es nicht verwendet. – VPfB

Verwandte Themen