Graceful shutdown in ArchLinux


21

Sto cercando di ottenere un arresto / riavvio grazioso in ArchLinux con GNOME Shell. Ora, quando chiedo l'arresto, si spegne immediatamente senza dare ai programmi aperti il ​​tempo di chiudere / salvare i file aperti. Di conseguenza, ogni volta che riavvio Chrome (ad esempio) mi dice che la sessione non è stata chiusa correttamente ecc. Leggendo sul web ho appreso che systemd durante lo spegnimento dei processi, invia prima un SIGTERMseguito SIGKILLse il processo non si chiude entro un determinato timeout. Tuttavia noto che sul mio sistema SIGKILLviene inviato immediatamente dopo SIGTERMe suppongo che questa sia la causa di una chiusura non gradita dei programmi.

Ho trovato della documentazione che (se l'ho letta correttamente) afferma che il timeout prima dell'invio SIGKILLpuò essere impostato TimeoutStopSec=dall'opzione. Anche l'invio SIGKILLpotrebbe essere disabilitato per SendSIGKILL=opzione. Ma non riesco a trovare dove configurare quelle opzioni ... esiste un file di configurazione di spegnimento / riavvio del sistema in cui posso impostare quelle opzioni?

MODIFICARE:

Ho fatto alcuni test e ho scoperto due cose interessanti:

  1. Se chiudo manualmente Chrome in questo modo killall -SIGTERM chrome, non mi lamenterò che non è stato chiuso correttamente la prossima volta che lo riavvio. Se invece lo chiudo in questo modo killall -SIGKILL chrome, si lamenterà. Questo mi dice che Chrome sta gestendo correttamente SIGTERM.
  2. Osservando l'output della mia procedura di spegnimento, systemd stampa Sending SIGTERM...immediatamente seguito daSending SIGKILL...

Secondo il commento qui sotto, systemd sta gestendo solo i suoi processi. Quindi nel mio caso GDM. Questo mi dice che il problema potrebbe essere:

  1. GDM non chiude correttamente i processi secondari (ad es. Chrome) (ovvero inviando loro SIGTERM)
  2. oppure systemd sta inviando a GDM un messaggio SIGKILL per non dargli il tempo di chiudere correttamente i propri figli.

C'è un modo per verificare / configurare come effettivamente GDM chiude i suoi figli?


1
Systemd segnala solo i processi direttamente sotto il suo controllo. Cose come Chrome non sono uno di quei processi. Systemd segnalerà il tuo display manager (xdm, gdm, kdm, qualunque cosa), spetta quindi al display manager segnalare i suoi figli, e così via lungo la linea fino a quando non arrivi a Chrome. Se nulla segnala Chrome, muore quando il server xorg viene spento e il display scompare.
Patrick

@Patrick: grazie, ho indovinato. Ecco perché ho provato ad aggiungere 'TimeoutStopSec = 90s' alla sezione '[Service]' di '/etc/systemd/system/display-manager.service' secondo questo: freedesktop.org/software/systemd/man/systemd.service. html ma non cambia nulla ... :(
lviggiani

Chrome dovrebbe essere sotto systemd'scontrollo - systemdè pid 1- ma Chrome viene eseguito dal suo script wrapper in una subshell e in seguito richiama i processi figlio. Tuttavia, farà ciò di cui ha bisogno per ucciderlo zygotesfintanto che il sistema sarà configurato correttamente. Stai usando una di quelle soluzioni temp-space per Chrome che troverai consigliate nel wiki di Arch?
Mikeserv,

1
Ho riscontrato un problema simile con KDE e Firefox su Arch. Non sono mai andato in giro a cercare di capire perché.
StrongBad,

2
GDM non sta segnalando processi. GDM è essenzialmente un modo stupido per collegare Xorg e PAM. il vero colpevole è gnome-session.
strugee,

Risposte:


2

Per spegnere correttamente il desktop, potrebbe essere necessario aumentare TimeoutStopSec=GDM o qualsiasi altro display manager che si sta utilizzando.


Mi sembra che GDM non avrebbe mai dovuto dire a systemd di chiudere in primo luogo se non avesse saputo se tutti i client potevano essere chiusi.
enigmatico

2

Questo ha funzionato per me sul mio Arch Linux con Gnome 3.12. Si è scoperto che potrebbe essere correlato alla configurazione /etc/gdm/PostSession/Default.

  1. Esegui sudo pacman -S wmctrlper installare wmctrl per la gestione di Windows.

  2. Crea un file eseguibile per chiudere tutte le finestre. Ad esempio, lo inserisco /home/[your_username]/bin/close-all-windowscon questi contenuti:

    #!/bin/sh
    wmctrl -l | while read -r line
    do
        wmctrl -c `echo "$line" | sed 's/.*  [0-9]* [your_hostname] //'`
    done
    
  3. Modifica /etc/gdm/PostSession/Defaulte aggiungi questi contenuti prima di exit 0:

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

Spero che funzionino.


Per Plasma 5, inserendo questo script in .config / plasma-workspace / shutdown / risolve il problema
AF7

-1

Lo script wmctrl di sorpass funziona bene per me (su CentOS 7 dovevo solo eseguire prima 'yum install wmctrl'). Tuttavia ho scoperto che / etc / gdm / PostSession / Default sembrava funzionare solo al logout, non allo spegnimento. Quindi invece di usare / etc / gdm / PostSession / Default ora chiamo lo script wmctrl di sorpass dallo script python di Seamus Phelan che può essere trovato in questi due siti:

Questa combinazione di script funziona perfettamente per la chiusura di Firefox, Chrome, ecc. In modo automatico e pulito quando eseguo il logout o lo spegnimento della mia macchina desktop CentOS 7. Si noti che con CentOS 7 è necessario eseguire 'yum install gnome-python2-gnome' per far funzionare questo script python.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.