Mir ist aufgefallen, dass ein Herunterfahrvorgang (z. B. shutdown -h now) mit Fedora 17 viel schneller geworden ist (fühlt sich an wie maximal 2 Sekunden). Daher frage ich mich, ob laufende Prozesse ordnungsgemäß beendet werden. Insbesondere unter Fedora (wiederum etwa 2 Sekunden) kann ich mir kaum vorstellen, dass jeder Prozess genügend Zeit hat, um beendet zu werden.
Ich gehe davon aus, dass alle Benutzerprozesse vom Benutzer (manuell) geschlossen wurden, bevor der Befehl zum Herunterfahren ausgegeben wurde, sodass nur noch Systemdienste übrig sind (diese haben beim Beenden möglicherweise trotzdem noch etwas zu tun).
Also schrieb ich ein winziges kleines Programm, das die meisten Signale abfängt und, wenn eine Anzahl (in Sekunden) angegeben wird, wartet, bevor es beendet wird. Ansonsten tut es nichts. Dann startete ich es – zuerst auf einem Debian-System – mit einer Verzögerung von 60 Sekunden. Als es ein SIGHUP erhielt (ich gehe davon aus, dass die übergeordnete Shell beendet wurde), startete es den 60-Sekunden-Countdown. Nach 10 Sekunden erhielt es ein freundliches SIGTERM. Mein Programm ignorierte dieses Signal und setzte den Countdown fort – bis Sekunde 40, als es tragischerweise abstürzte. 20 Sekunden, nachdem es zum Beenden aufgefordert wurde (SIGHUP), wurde es also SIGKILLed.
Nun der gleiche Test auf Fedora 17 (3.5.3-1.fc17.x86_64):
Signal 1 abgefangen.
Laufzeit: 8 Sekunde(n).
Verzögerung der Beendigung um 60 Sekunde(n).
60...
Signal 15 abgefangen – ignorieren!
59...
58...
Nicht einmal eine Sekunde nach dem SIGHUP erhält es das SIGTERM. Ein Programmierer kann die Beendigung seines Programms nach einem SIGTERM verzögern, um Jobs zu beenden, Einstellungen zu speichern usw. (anders als vielleicht nach einem SIGINT). Mein Programm erhält 2 Sekunden, bevor es beendet wird.
Was passiert, wenn ein laufender Prozess beim Speichern einiger Einstellungen beendet wird (beschädigte Einstellungsdatei?) oder eine Art Daemon (z. B. ein Dateiserver) zwischengespeicherte Daten auf die Festplatte schreibt (beschädigte Daten?)?
Antwort1
Dienste können in ihrer Datei angeben, wie sie beendet werden möchten *.service
. Sie können jedes beliebige Timeout auswählen, Sie müssen sich nicht mit der Standardeinstellung zufrieden geben. Wenn Sie PostgreSQL oder MySQL installiert haben, sehen Sie sich deren Dienstdateien an, um zu sehen, wie sie ein sauberes Herunterfahren veranlassen.