Würdevolles Herunterfahren in ArchLinux

21

Ich versuche, ArchLinux mit GNOME Shell ordnungsgemäß herunterzufahren / neu zu starten. Wenn ich jetzt nach dem Herunterfahren frage, wird es sofort heruntergefahren, ohne dass geöffnete Programme Zeit zum ordnungsgemäßen Schließen / Speichern geöffneter Dateien haben. Wenn ich Chrome neu starte (zum Beispiel), wird mir dadurch mitgeteilt, dass die Sitzung nicht ordnungsgemäß geschlossen wurde. Durch das Lesen im Internet habe ich erfahren, dass systemd beim Herunterfahren von Prozessen zuerst ein SIGTERMgefolgt von sendet, SIGKILLwenn der Prozess nicht geschlossen wird mit einer bestimmten Auszeit. Allerdings stelle ich fest, dass auf meinem System SIGKILLsofort danach gesendet wird SIGTERMund ich vermute, dass dies die Ursache für einen nicht ordnungsgemäßen Programmabbruch ist.

Ich habe eine Dokumentation gefunden, in der (wenn ich sie richtig gelesen habe) angegeben ist, dass das Zeitlimit vor dem Senden SIGKILLper TimeoutStopSec=Option festgelegt werden kann. Das Senden SIGKILLkann auch SendSIGKILL=optional deaktiviert werden . Aber ich kann nicht finden, wo ich diese Optionen konfigurieren soll ... Gibt es eine Konfigurationsdatei zum Herunterfahren / Neustarten des Systems, in der ich diese Optionen festlegen kann?

BEARBEITEN:

Ich habe einige Tests gemacht und zwei interessante Dinge entdeckt:

  1. Wenn ich Chrome auf diese Weise manuell schließe killall -SIGTERM chrome, wird nicht beanstandet, dass es beim nächsten Neustart nicht ordnungsgemäß geschlossen wurde. Wenn ich es stattdessen so schließe killall -SIGKILL chrome, wird es sich beschweren. Dies sagt mir, dass Chrom SIGTERM richtig handhabt.
  2. Wenn ich die Ausgabe meines Herunterfahrvorgangs betrachte, druckt systemd Sending SIGTERM...sofort, gefolgt vonSending SIGKILL...

Laut dem folgenden Kommentar behandelt systemd nur seine Prozesse. Also in meinem Fall GDM. Dies sagt mir, dass das Problem sein könnte:

  1. Entweder schließt GDM die untergeordneten Prozesse (z. B. Chrome) nicht korrekt (z. B. indem SIGTERM an sie gesendet wird).
  2. oder systemd sendet GDM eine SIGKILL-Nachricht zu früh, damit es nicht die Zeit hat, seine untergeordneten Elemente ordnungsgemäß zu schließen.

Gibt es eine Möglichkeit zu überprüfen / konfigurieren, wie GDM seine Kinder tatsächlich schließt?

lviggiani
quelle
1
Systemd signalisiert nur Prozesse direkt unter seiner Kontrolle. Dinge wie Chrom gehören nicht dazu. Systemd signalisiert Ihrem Display-Manager (xdm, gdm, kdm, was auch immer), und es ist dann Sache des Display-Managers, seine untergeordneten Elemente zu signalisieren und so weiter, bis Sie zu Chrome gelangen. Wenn nichts Chrom signalisiert, stirbt es, wenn der xorg-Server heruntergefahren wird und die Anzeige erlischt.
Patrick
@Patrick: danke, hab ich mir gedacht. Aus diesem Grund habe ich versucht, 'TimeoutStopSec = 90s' zum Abschnitt '[Service]' von '/etc/systemd/system/display-manager.service' hinzuzufügen: freedesktop.org/software/systemd/man/systemd.service. HTML, aber nichts ändert sich ... :(
lviggiani
Chrome sollte unter systemd'sKontrolle sein - systemdist pid 1-, aber Chrome führt sein Wrapper-Skript in einer Subshell aus und ruft anschließend untergeordnete Prozesse auf. Dennoch wird es tun, was es braucht, um es zu beenden zygotes, solange Ihr System richtig konfiguriert ist. Verwenden Sie eine der im Arch-Wiki empfohlenen temporären Lösungen für Chrome?
mikeserv
1
Ich habe ein ähnliches Problem mit KDE und Firefox on Arch. Ich bin nie dazu gekommen, herauszufinden, warum.
StrongBad
2
GDM signalisiert keine Prozesse. GDM ist im Grunde genommen eine blöde Art, Xorg und PAM zusammenzubringen. der wahre Schuldige ist gnome-session.
Strugee

Antworten:

2

Um Ihren Desktop ordnungsgemäß herunterzufahren, müssen Sie möglicherweise den TimeoutStopSec=Wert für GDM oder einen anderen von Ihnen verwendeten Anzeigemanager erhöhen .

CameronNemo
quelle
Mir scheint, GDM hätte systemd niemals anweisen sollen, überhaupt herunterzufahren, wenn es nicht wüsste, ob alle Clients geschlossen werden könnten.
EnigmaticPhysicist
2

Dies funktionierte für mich auf meinem Arch Linux mit Gnome 3.12. Es stellte sich heraus, dass es möglicherweise mit der Konfiguration in Verbindung steht /etc/gdm/PostSession/Default.

  1. Führen Sie aus sudo pacman -S wmctrl, um wmctrl für die Windows-Verwaltung zu installieren.

  2. Erstellen Sie eine ausführbare Datei zum Schließen aller Fenster. Zum Beispiel habe ich es /home/[your_username]/bin/close-all-windowsmit diesen Inhalten eingefügt:

    #!/bin/sh
    wmctrl -l | while read -r line
    do
        wmctrl -c `echo "$line" | sed 's/.*  [0-9]* [your_hostname] //'`
    done
    
  3. Ändern /etc/gdm/PostSession/DefaultSie diese Inhalte und fügen Sie sie hinzu, bevor Sie exit 0:

    echo " Closing selected windows programs gracefully"
    export DISPLAY=:0
    su [your_username] -c /home/[your_username]/bin/close-all-windows
    

Hoffe das wird funktionieren.

Sorpaas
quelle
Für Plasma 5 behebt das Einfügen dieses Skripts in .config / plasma-workspace / shutdown / das Problem
AF7
-1

Das wmctrl-Skript von sorpass funktioniert gut für mich (auf CentOS 7 musste ich erst 'yum install wmctrl' ausführen). Allerdings stellte ich fest, dass / etc / gdm / PostSession / Default nur beim Abmelden zu laufen schien, nicht beim Herunterfahren. Anstatt / etc / gdm / PostSession / Default zu verwenden, rufe ich jetzt das wmctrl-Skript von sorpass aus dem Python-Skript von Seamus Phelan auf, das an diesen beiden Standorten zu finden ist:

Diese Kombination von Skripten eignet sich hervorragend zum automatischen und sauberen Schließen von Firefox, Chrome usw., wenn ich mich von meinem CentOS 7-Desktop-Computer abmelde oder ihn herunterfahre. Beachten Sie, dass Sie unter CentOS 7 'yum install gnome-python2-gnome' ausführen müssen, damit dieses Python-Skript funktioniert.

Jim
quelle