Wie man SIGTERM-Signal anmutig verarbeitet?
Nehmen wir an, wir haben auch so ein trivial-daemon in python geschrieben:
def mainloop():
while True:
# 1. do
# 2. some
# 3. important
# 4. job
# 5. sleep
mainloop()
und wir daemonize es mit start-stop-daemon
die standardmäßig sendet SIGTERM
(TERM
) signal auf --stop
.
Nehmen wir an, der aktuelle Schritt ausgeführt wird #2
. Und genau in diesem moment schicken wir TERM
signal.
Was passiert, ist, dass die Ausführung sofort beendet.
Ich habe festgestellt, dass ich damit umgehen kann das signal-Ereignis mit signal.signal(signal.SIGTERM, handler)
aber die Sache ist, dass es immer noch unterbricht die aktuelle Ausführung und übergibt die Kontrolle an handler
.
So, meine Frage ist - ist es möglich, nicht unterbrechen, das aktuelle Ausführung, sondern Griff die TERM
signal in einem separaten thread (?) so, ich war in der Lage shutdown_flag = True
so dass mainloop()
eine chance hatte, zu stoppen, anmutig?
InformationsquelleAutor der Frage zerkms | 2013-08-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einer Klasse, auf saubere Lösung:
InformationsquelleAutor der Antwort Mayank Jaiswal
Erstens: ich bin nicht sicher, dass du einen zweiten thread um die shutdown_flag. Warum nicht setzen es direkt in den SIGTERM-handler?
Alternative ist, um eine Ausnahme von der
SIGTERM
handler, die weitergegeben wird, bis der stack. Vorausgesetzt, du hast richtiges exception handling (z.B. mitwith
/contextmanager
undtry: ... finally:
Blöcke) dies sollte ein ziemlich ordnungsgemäßes Herunterfahren, ähnlich wie wenn Sie wurden zuCtrl-C
Ihr Programm.Beispiel Programm
signals-test.py
:Nun die Strg-C-Verhalten:
Dieses mal schicke ich es
SIGTERM
nach 4 Iterationen mitkill $(ps aux | grep signals-test | awk '/python/{print $2}')
:Dieser Zeit, die ich aktivieren meine custom
SIGTERM
handler und senden Sie esSIGTERM
:InformationsquelleAutor der Antwort Will Manley
Ich denke, Sie sind in der Nähe zu einer möglichen Lösung.
Ausführen
mainloop
in einem separaten thread und erweitern Sie es mit der Eigenschaftshutdown_flag
. Das signal kann abgefangen werden, mitsignal.signal(signal.SIGTERM, handler)
im Haupt-thread (nicht in einem separaten thread). Der signal-handler solltenshutdown_flag
zu Wahren und warten, bis der thread zu Ende mitthread.join()
InformationsquelleAutor der Antwort moliware
Hier ist ein einfaches Beispiel ohne Gewinde oder Klassen.
InformationsquelleAutor der Antwort thoughtarray
Basierend auf den vorherigen Antworten, die ich erstellt habe, einen Kontext-manager schützt vor sigint und sigterm.
InformationsquelleAutor der Antwort Okke