2014-01-18 6 views
8

Ich installierte python-daemon und jetzt versuche ich, die Signalverarbeitung richtig zu bekommen. Mein Code:Signalverarbeitung in Python-Daemon

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

import signal, time, syslog 
import daemon 

def runDaemon(): 
    context = daemon.DaemonContext() 

    context.signal_map = { signal.SIGTERM: programCleanup } 

    context.open() 
    with context: 
     doMainProgram() 

def doMainProgram(): 
    while True: 
     syslog.syslog("pythonDaemon is running") 
     time.sleep(5) 

def programCleanup(): 
    syslog.syslog("pythonDaemon STOP") 

if __name__ == "__main__": 
    runDaemon() 

Wenn ich starten Sie den Code alles wie erwartet funktioniert: Der Text pythonDaemon läuft alle 5 Sekunden auf /var/log/syslog geschrieben wird. Aber wenn ich den Daemon mit kill -TERM *PID* beenden möchte, wird der Daemon beendet, aber der Text PythonDaemon STOP fehlt von Syslog.

Was mache ich falsch?

NB: Ich arbeite nicht mit from daemon import runner hier, denn das gibt mir einen Fehler (sieht aus wie ich brauche eine ältere Version von lockfile) und ich werde das nicht beheben, es sei denn, es ist die einzige Möglichkeit, die Signalbehandlung richtig zu machen .

Antwort

8

Ihr Code sieht gut aus, außer dass der Signalhandler nicht aufgerufen wird, weil er die falsche Signatur hat. Machen es wie folgt:

def programCleanup(signum, frame): 

die Dokumentation Zitiert (signal.signal()):

Die Prozedur wird mit zwei Argumenten aufgerufen: die Signalnummer und der aktuelle Stapelrahmen

Verwandte Themen