it-swarm.com.de

Kein SIGTERM vor SIGKILL / Herunterfahren mit systemd unter Ubuntu 16.04

Ich bin auf dieses Problem gestoßen, als ich versuchte eine Frage zu Stackoverflow zu beantworten .

Beim Herunterfahren sendet Ubuntu 12.04 SIGTERM an alle Prozesse und wartet höchstens 10 Sekunden, bevor sie mit SIGKILL beendet werden (es sei denn, sie wurden zuvor beendet). Meine Antwort auf SO enthält sogar ein Python= Skript, das dieses Verhalten überprüft. Das Skript wird in einem Terminal gestartet, in den Hintergrund gesendet und dann vom Terminal abgelehnt Wenn das Skript SIGTERM empfängt, läuft es weiter und druckt fortlaufend in eine Datei, wie lange es läuft afterSIGTERM empfängt.

Unter Ubuntu 16.04 wird das Skript jedoch sofort beim Herunterfahren beendet (es wird kein SIGTERM protokolliert).

Ich habe eine Weile gegoogelt, aber ich konnte nichts Nützliches finden. Hat noch niemand diese bahnbrechende Veränderung für die aktuelle LTS-Version erlebt?

Hier ist das Skript signaltest.py

import signal
import time

stopped = False

out = open('log.txt', 'w')

def stop(sig, frame):
    global stopped
    stopped = True
    out.write('caught SIGTERM\n')
    out.flush()

signal.signal(signal.SIGTERM, stop)

while not stopped:
    out.write('running\n')
    out.flush()
    time.sleep(1)

stop_time = time.time()
while True:
    out.write('%.4fs after stop\n' % (time.time() - stop_time))
    out.flush()
    time.sleep(0.1)

Das Skript verwendet die Datei log.txt im aktuellen Verzeichnis für alle Ausgaben. Es gibt eine Schleife, die jede Sekunde "Laufen" druckt. Der Empfang von SIGTERM unterbricht die Schleife und startet eine weitere Schleife, die die Sekunden ausgibt, die seit dem Empfang von SIGTERM vergangen sind.

Das Skript wird von einem mit disown getrennten Terminal ausgeführt:

python signaltest.py &
disown

Nur um klar zu sein: Dies ist kein Duplikat von buntu sendet beim Herunterfahren kein SIGTERM . Die Frage bezieht sich auf Desktop-Anwendungen und die Antworten passen auch nicht.

1
code_onkel

systemd (im Gegensatz zu upstart in früheren Ubuntu-Versionen) sendet beim Herunterfahren zusätzlich SIGHUP (und wartet 90s statt 10s, bevor SIGKILL gesendet wird). Ich schlage vor, SIGHUP zu ignorieren oder SIGTERM und SIGHUP auf die gleiche (idempotente) Weise zu behandeln.

Das geänderte Testskript könnte folgendermaßen geändert werden:

import signal
import time

stopped = False

out = open('log.txt', 'w')

def stop(sig, frame):
    global stopped
    stopped = True
    out.write('caught SIGTERM\n')
    out.flush()

def ignore(sig, frsma):
    out.write('ignoring signal %d\n' % sig)
    out.flush()

signal.signal(signal.SIGTERM, stop)
signal.signal(signal.SIGHUP, ignore)

while not stopped:
    out.write('running\n')
    out.flush()
    time.sleep(1)

stop_time = time.time()
while True:
    out.write('%.4fs after stop\n' % (time.time() - stop_time))
    out.flush()
    time.sleep(0.1)
3
code_onkel