Daemon und SIGTERM

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
conloos
User
Beiträge: 22
Registriert: Freitag 23. November 2007, 09:54

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
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

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
conloos
User
Beiträge: 22
Registriert: Freitag 23. November 2007, 09:54

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.
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

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.
conloos
User
Beiträge: 22
Registriert: Freitag 23. November 2007, 09:54

Hab ich gemacht und ein paar Sachen übernommen ... danke :-)


con
Antworten