Ubuntu sendet beim Herunterfahren kein SIGTERM

21

Ich fange an zu vermuten, dass Ubuntu den laufenden Anwendungen nicht mitteilt, dass es heruntergefahren wird, damit sie ordnungsgemäß beendet werden, sondern sie zum Beenden zwingt.

Wenn ich chrome beim Herunterfahren offen lasse, heißt es, dass es beim letzten erneuten Öffnen nach dem Booten nicht richtig geschlossen wurde, fragt LibreOffice nicht, ob ich mein Dokument speichern möchte und ich erstelle eine Anwendung, die Code ausführen muss Dies ist jedoch nicht zulässig, wenn der Computer heruntergefahren wird.

Wie ich es verstanden habe, wird SIGTERM zuerst an alle Prozesse gesendet, damit diese ordnungsgemäß beendet werden können. Wenn SIGKILL nicht beendet wird, wird SIGKILL gesendet, um sie zum Beenden zu zwingen. Es scheint, dass Ubuntu entweder überhaupt kein SIGTERM sendet oder den Anwendungen nicht genügend Zeit gibt, bevor SIGKILL gesendet wird.

Kann ich das irgendwie beheben?

Ich verwende Ubuntu 16.04, aber das Problem bestand auch in 15.10. Ich kann nicht sagen, ob es dort vorher war, da ich mit Ubuntu angefangen habe, als 15.10 die neueste Version war.

Bearbeiten: Ich verwende Unity und fahre meinen Computer herunter, indem ich das Zahnrad in der oberen rechten Ecke drücke und Herunterfahren auswähle, obwohl das Problem dasselbe ist, wenn ich sudo haltim Terminal arbeite.

Bearbeiten: Ich beobachte das gleiche Verhalten, wenn ich mich nur auslogge. Ich vermute, dass das Signal beim Abmelden gesendet werden soll und daher das Problem beim Herunterfahren und Abmelden auftritt.

GKraft
quelle
Wie fahren Sie herunter?
Terdon
1
Chromium und LibreOffice behandeln SIGTERM nicht so, wie Sie es möchten
Andrea Corbellini
2
Ich bin nicht sicher, ob ich verstehe, was du meinst. Meinen Sie damit, dass sie SIGTERM nicht richtig handhaben? Vielleicht tun sie es nicht, aber wie ich in meiner Frage schrieb, arbeite ich an einem Programm, das SIGTERM beherrscht, aber dieser Code scheint nie ausgeführt zu werden. SIGINT beim Drücken von Strg + C funktioniert einwandfrei. Ich glaube immer noch, dass es ein Problem mit Ubuntu gibt, das laufende Prozesse beim Herunterfahren benachrichtigt.
GKraft
1
Möglicherweise im Zusammenhang mit diesem Fehler: # 1448259 Systemd sendet beim Herunterfahren nicht zuerst SIGTERM ?
JonasCz - Wiedereinsetzung von Monica am
2
Es ist ärgerlich, alle Anwendungen manuell schließen zu müssen, und wenn Sie eine minimierte vergessen? Es wird deine Arbeit nicht retten. Und es gibt viele Hintergrundprozesse, die Sie entweder nicht einfach steuern oder nicht überlegen können. Sie werden keine Chance bekommen, nach sich selbst aufzuräumen oder zu retten, was immer sie taten.
GKraft

Antworten:

3

Leider funktioniert es so nicht ganz. Viele dieser Programme, die tatsächlich einen Signal-Handler haben, blockieren das Signal nicht, um einen Bestätigungsdialog anzuzeigen. Die Signalverarbeitung ist häufig minimal oder fehlt.

Sie können es ganz einfach ausprobieren, ohne den Computer herunterfahren zu müssen. Senden Sie SIGTERM einfach an Ihren laufenden Firefox- oder LibreOffice-Prozess:

$ pkill firefox

Normalerweise fragt Firefox Sie möglicherweise, ob Sie das Programm wirklich schließen möchten. Außerdem dauert es in der Regel eine Weile, bis der Vorgang beendet ist, insbesondere wenn er über einen längeren Zeitraum ausgeführt wurde und mehr als 1 GB RAM beansprucht. Nach dem Schließen des letzten Fensters dauert es oft eine Minute, bis der Vorgang beendet ist. Nichts davon passiert, wenn Sie SIGTERM senden. Der Vorgang wird sofort abgebrochen.

In einigen Desktop-Umgebungen werden jedoch alle geöffneten Fenster vor dem Herunterfahren geschlossen. Im Gegensatz zu SIGTERM entspricht das programmgesteuerte Schließen eines Fensters dem Klicken auf die X-Schaltfläche dieses Fensters oder Alt+ F4. Dies ist auch, was das Skript in der anderen Antwort tut - es verwendet wmctrl, um alle offenen Fenster ordnungsgemäß zu schließen.

Wenn ein Fenster geschlossen wird, ist das Programm nicht in Eile, und es kann alles in diesem Fenster schließen, z. B. geöffnete Registerkarten, und es kann auch ein Dialogfenster anzeigen, wenn nicht gespeicherte Arbeit vorhanden ist. Sobald alle offenen Fenster einer Anwendung geschlossen wurden, wird der Vorgang in der Regel kurz danach beendet.

Das hängt also von Ihrer Desktop-Umgebung ab (vorausgesetzt, Sie verwenden Ihre Desktop-Umgebung zum Herunterfahren und nicht sudo poweroff). Beispielsweise sollte KDE warten, bis geöffnete Fenster geschlossen sind, bevor es beendet wird, während MATE dies nicht tut.

Fazit: Schließen Sie alle geöffneten Fenster vor dem Herunterfahren manuell. Oder verwenden Sie eine Desktop-Umgebung, die darauf wartet, dass alle Fenster geschlossen werden.

c0xc
quelle
Ich sehe, dass das Herunterfahren und die Signalverarbeitung nicht genau so funktioniert haben, wie ich es mir vorgestellt habe. Jetzt verstehe ich, wie es funktionieren soll und warum es nicht wie erwartet funktioniert hat.
GKraft
0

Für das, was es wert ist, habe ich vor einiger Zeit dieses Verfahren im Manjaro-Forum gefunden:

close_apps () {
WIN_IDs=$(wmctrl -l | grep -vwE "Desktop$|xfce4-panel$" | cut -f1 -d' ')
for i in $WIN_IDs; do wmctrl -ic "$i"; done

# Keep checking and waiting until all windows are closed
while [ "$WIN_IDs" != "" ]; do
        sleep 0.1;
        WIN_IDs=$(wmctrl -l | grep -vwE "Desktop$|xfce4-panel$" | cut -f1 -d' ')
done

}

Sie können es in einem eigenen Skript aufrufen, um alle offenen Apps vor dem Herunterfahren (oder Neustart) zu schließen.

Das einzige Problem ist, dass es für Xfce erstellt wurde und Änderungen erfordert, die von Unity DE eingeführt werden. Eine kleine Hilfe von jemandem, der sich besser auskennt, wäre hilfreich, um das OP-Problem zu lösen.

SR
quelle
Ich habe einige Tage lang keinen Zugriff auf meinen Computer, daher kann ich ihn nicht testen, auch wenn er korrigiert ist. Sollte es wirklich notwendig sein, ein solches Skript zu verwenden? Ich denke, Ubuntu sollte es alleine schaffen.
GKraft
Einverstanden. Es funktioniert jedoch perfekt in Xubuntu. Beispielsweise wartet das Herunterfahren auf unbestimmte Zeit, wenn ein nicht gespeichertes Dokument vorhanden ist.
SR
0

Tatsächlich ist auf Ask ein Teil des Skripts verfügbar, der alle Fenster schließt und nicht von einem bestimmten DE abhängt. 2. und 3. Antworten sind besonders nützlich. Mit nur wenigen Zeilen mehr und durch Erstellen eines Launchers in der Kontrollleiste oder auf dem Desktop können Sie das ordnungsgemäße Herunterfahren erreichen, das in dem DE funktioniert, das Sie verwenden.

So schließen Sie alle geöffneten Fenster ordnungsgemäß

SR
quelle
Sie scheinen vielversprechend. Ich werde wahrscheinlich ein ähnliches Skript verwenden.
GKraft