Graceful zamknięcie w ArchLinux


21

Próbuję uzyskać płynne zamknięcie / ponowne uruchomienie w ArchLinux z GNOME Shell. Teraz, gdy proszę o zamknięcie, natychmiast się wyłącza, nie dając programom czasu na pełne wdzięczne zamykanie / zapisywanie otwartych plików. W rezultacie za każdym razem, gdy ponownie uruchamiam Chrome (na przykład), mówi mi, że sesja nie została poprawnie zamknięta itp. Czytając w Internecie dowiedziałem się, że system został zamknięty podczas zamykania procesów, najpierw wysyła znak „ SIGTERMa”, SIGKILLjeśli proces się nie zamyka z określonym limitem czasu. Zauważam jednak, że w moim systemie SIGKILLjest wysyłany natychmiast po nim SIGTERMi myślę, że jest to przyczyną nieoczekiwanego zakończenia programów.

Znalazłem dokumentację, która (jeśli poprawnie ją odczytam) określa ten limit czasu przed wysłaniemSIGKILL można ustawić TimeoutStopSec=opcjonalnie. Również wysyłanie SIGKILLmoże być wyłączone przez SendSIGKILL=opcję. Ale nie mogę znaleźć, gdzie skonfigurować te opcje ... czy istnieje plik konfiguracji systemu zamykania / ponownego uruchamiania systemu, w którym mogę ustawić te opcje?

EDYTOWAĆ:

Zrobiłem test i odkryłem dwie interesujące rzeczy:

  1. Jeśli ręcznie zamknę Chrome w ten sposób killall -SIGTERM chrome , nie będzie narzekać, że nie został poprawnie zamknięty przy następnym uruchomieniu. Jeśli zamiast tego zamknę to w ten sposób killall -SIGKILL chrome, będzie narzekać. To mówi mi, że chrome poprawnie obsługuje SIGTERM.
  2. Patrząc na wynik mojej procedury zamykania, wydruk systemowy Sending SIGTERM... natychmiast po nimSending SIGKILL...

Zgodnie z komentarzem poniżej systemd obsługuje tylko swoje procesy. Więc w moim przypadku GDM. To mówi mi, że problemem może być:

  1. albo GDM nie zamyka poprawnie swoich procesów potomnych (np. Chrome) (tj. wysyłając do nich SIGTERM)
  2. lub systemd wysyła do GDM komunikat SIGKILL na wczesny czas, nie dając mu czasu na prawidłowe zamknięcie swoich elementów potomnych.

Czy istnieje sposób sprawdzenia / skonfigurowania, w jaki sposób GDM zamyka swoje dzieci?


1
Systemd sygnalizuje tylko procesy bezpośrednio pod jego kontrolą. Rzeczy takie jak chrom nie są jednym z tych procesów. Systemd zasygnalizuje twojemu menedżerowi wyświetlania (xdm, gdm, kdm, cokolwiek), następnie to menedżer ekranu zasygnalizuje swoje dzieci, i tak dalej, aż dojdziesz do chrome. Jeśli nic nie sygnalizuje chrome, umiera, gdy serwer xorg jest wyłączony, a jego wyświetlacz gaśnie.
Patrick

@Patrick: dzięki, tak sądzę. Właśnie dlatego próbowałem dodać „TimeoutStopSec = 90s” do sekcji „[Service]” w „/etc/systemd/system/display-manager.service” zgodnie z tym: freedesktop.org/software/systemd/man/systemd.service. HTML, ale nic się nie zmienia ... :(
lviggiani

Chrome powinien być pod systemd'skontrolą - systemdjest pid 1- ale Chrome wykonuje skrypt otoki w podpowłoce i wywołuje procesy potomne. Mimo to zrobi wszystko, co konieczne, aby go zabić zygotes, o ile system jest odpowiednio skonfigurowany. Czy używasz jednego z tych tymczasowych rozwiązań dla Chrome, które znajdziesz w wiki Arch?
mikeserv

1
Mam podobny problem z KDE i Firefoksem w Arch. Nigdy nie próbowałem dowiedzieć się, dlaczego.
StrongBad

2
GDM nie przetwarza sygnałów. GDM jest w zasadzie głupim sposobem na połączenie Xorg i PAM. prawdziwym winowajcą jest gnome-session.
strugee

Odpowiedzi:


2

Aby z wdziękiem wyłączyć komputer, może być konieczne podniesienie poziomu TimeoutStopSec=GDM lub innego używanego menedżera wyświetlania.


Wydaje mi się, że GDM nigdy nie powinien był mówić systemd o zamknięciu, gdyby nie wiedział, czy wszyscy klienci mogą zostać zamknięci.
enigmatyczny

2

To działało dla mnie na moim Arch Linuxie z Gnome 3.12. Okazało się, że może to być związane z konfiguracją w /etc/gdm/PostSession/Default.

  1. Uruchom, sudo pacman -S wmctrlaby zainstalować wmctrl do zarządzania systemem Windows.

  2. Utwórz plik wykonywalny do zamknięcia wszystkich okien. Na przykład umieszczam go /home/[your_username]/bin/close-all-windowsz następującymi treściami:

    #!/bin/sh
    wmctrl -l | while read -r line
    do
        wmctrl -c `echo "$line" | sed 's/.*  [0-9]* [your_hostname] //'`
    done
    
  3. Zmodyfikuj /etc/gdm/PostSession/Defaulti dodaj te treści przed exit 0:

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

Mam nadzieję, że to zadziała.


W przypadku Plazmy 5 umieszczenie tego skryptu w .config / plazma-workspace / shutdown / rozwiązuje problem
AF7

-1

skrypt wmctrl sorpass działa dla mnie dobrze (na CentOS 7 musiałem najpierw uruchomić „yum install wmctrl”). Odkryłem jednak, że / etc / gdm / PostSession / Default wydaje się działać tylko przy wylogowaniu, a nie przy wyłączaniu. Dlatego zamiast używać / etc / gdm / PostSession / Default, teraz wywołuję skrypt sorpass wmctrl ze skryptu pythonowego Seamusa Phelana, który można znaleźć na tych dwóch stronach:

Ta kombinacja skryptów świetnie nadaje się do automatycznego i czystego zamykania przeglądarki Firefox, Chrome itp. Po wylogowaniu lub wyłączeniu komputera stacjonarnego CentOS 7. Zauważ, że w CentOS 7 musisz uruchomić 'yum install gnome-python2-gnome', aby skrypt działał.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.