Seite 1 von 1

Daemon und SIGTERM

Verfasst: Sonntag 6. Dezember 2009, 22:58
von conloos
Hallo,

ich habe einen Daemon, nach: http://code.activestate.com/recipes/66012/.
Nach allen fork()'s habe ich die Signale gebunden:

Code: Alles auswählen

try:
    signal.signal(signal.SIGTERM, on_sigterm)
    signal.signal(signal.SIGINT, on_sigterm)
except Exception,e:
    logger.debug(_(u"Das binden der SIGTERM und SIGINT ist fehlgeschlagen: %s" % e))
    raise Exception, e
Wenn ich dem Daemon ein:

Code: Alles auswählen

os.kill(pid,signal.SIGTERM)
schicke reagiert er aber nicht drauf. Der Daemon wird hart beendet, ohne die on_sigterm() auszuführen.
Irgendwelche Ideen?

grüße Con

Verfasst: Sonntag 6. Dezember 2009, 23:36
von Darii
Was ist on_sigterm? Vllt. schlägt da drin ja was fehl? Desweiteren habe ich festellen müssen, dass die bei Activestate vorgeschlagene Lösung zu Problemen führen kann. Ich würde die Django-Implementierung empfehlen: http://code.djangoproject.com/browser/d ... emonize.py

Verfasst: Montag 7. Dezember 2009, 09:49
von conloos
Ne, das erste was on_siterm() macht ist eine logging nachricht ...
on_sigterm() wird also nicht aufgerufen.

Code: Alles auswählen

    def on_sigterm(self, signum, frame):
        u"""Reagieren auf das SIGTERM- Signal.
        
        Auf POSIX kompatiblen Plattformen bedeutet das SIGTERM- Signal, dass
        der Prozess beendet werden soll. Das SIGTERM wird normaler weise durch ein SIGKILL ausgelöst."""
        
        logger.debug(_(u'on_sigterm'))
        
        shutdown = self.stop_plugins(self.plugins)
        self.running = False
        if shutdown == True:
            sys.stdout(_(u"Alle Plugins wurden erfolgreich beendet."))
Das richtige binden ist:

Code: Alles auswählen

try:
    signal.signal(signal.SIGTERM, self.on_sigterm)
    signal.signal(signal.SIGINT, self.on_sigterm)
except Exception,e:
    logger.debug(_(u"Das binden der SIGTERM und SIGINT ist fehlgeschlagen: %s" % e))
    raise Exception, e
Sollte also eigentlich gehen, ich gug mir mal die vorgeschlagene django implimentierung an.

Verfasst: Montag 7. Dezember 2009, 10:05
von Darii
conloos hat geschrieben:Ne, das erste was on_siterm() macht ist eine logging nachricht ...
on_sigterm() wird also nicht aufgerufen.
Oder das Logging schlägt schlicht und ergreifend fehl. Was durchaus passieren kann, wenn die stdout etc. nicht richtig weitergeleitet wurden, guck dir wirklich mal die Django-Implementierung an.

Verfasst: Montag 7. Dezember 2009, 21:54
von conloos
Hab ich gemacht und ein paar Sachen übernommen ... danke :-)


con