Arrêt progressif dans ArchLinux

21

J'essaie d'obtenir un arrêt / redémarrage gracieux dans ArchLinux avec GNOME Shell. Maintenant, lorsque je demande l'arrêt, il s'arrête immédiatement sans donner aux programmes ouverts le temps de fermer / enregistrer les fichiers ouverts avec élégance. Par conséquent, chaque fois que je redémarre Chrome (par exemple), il me dit que la session n'a pas été fermée correctement, etc. En lisant sur le Web, j'ai appris que systemd lors de l'arrêt des processus, il envoie d'abord un SIGTERMsuivi de SIGKILLsi le processus ne se ferme pas. avec un délai d'attente donné. Cependant, je remarque que mon système SIGKILLest envoyé immédiatement après SIGTERMet je suppose que c'est la cause d'une interruption non gracieuse des programmes.

J'ai trouvé une documentation qui (si je la lis correctement) indique que le délai avant l'envoi SIGKILLpeut être défini par TimeoutStopSec=option. L'envoi SIGKILLpourrait également être désactivé par SendSIGKILL=option. Mais je ne trouve pas où configurer ces options ... y a-t-il un fichier de configuration d'arrêt / redémarrage de systemd où je peux définir ces options?

ÉDITER:

J'ai fait quelques tests et j'ai découvert deux choses intéressantes:

  1. Si je ferme manuellement le chrome comme celui killall -SIGTERM chrome-ci, il ne se plaindra pas qu'il n'a pas été correctement fermé la prochaine fois que je le redémarrerai. Si je le ferme comme ça à la place killall -SIGKILL chrome, il se plaindra. Cela m'indique que Chrome gère correctement SIGTERM.
  2. En regardant le résultat de ma procédure d'arrêt, systemd imprime Sending SIGTERM...immédiatement suivi deSending SIGKILL...

Selon le commentaire ci-dessous, systemd gère uniquement ses processus. Donc dans mon cas GDM. Cela me dit que le problème pourrait être:

  1. Soit GDM ne ferme pas correctement ses processus enfants (par exemple Chrome) (c'est-à-dire en leur envoyant SIGTERM)
  2. ou systemd envoie à GDM un message SIGKILL pour ne pas lui donner le temps de fermer correctement ses enfants.

Existe-t-il un moyen de vérifier / configurer la façon dont GDM ferme ses enfants?

lviggiani
la source
1
Systemd signale uniquement les processus directement sous son contrôle. Des choses comme le chrome ne font pas partie de ces processus. Systemd signalera votre gestionnaire d'affichage (xdm, gdm, kdm, peu importe), c'est ensuite au gestionnaire d'affichage de signaler ses enfants, et ainsi de suite jusqu'à ce que vous arriviez à Chrome. Si rien ne signale le chrome, il meurt lorsque le serveur xorg est arrêté et son affichage disparaît.
Patrick
@Patrick: merci, je l'ai deviné. C'est pourquoi j'ai essayé d'ajouter «TimeoutStopSec = 90s» à la section «[Service]» de «/etc/systemd/system/display-manager.service» en fonction de ceci: freedesktop.org/software/systemd/man/systemd.service. html mais rien ne change ... :(
lviggiani
Chrome devrait être sous systemd'scontrôle - systemdest pid 1- mais Chrome exécute son script wrapper dans un sous-shell et appelle ensuite les processus enfants. Pourtant, il fera ce dont il a besoin pour le tuer zygotestant que votre système est correctement configuré. Utilisez-vous l'une de ces solutions d'espace temporaire pour Chrome que vous trouverez recommandées dans le wiki Arch?
mikeserv
1
Je rencontre un problème similaire avec KDE et Firefox sur Arch. Je n'ai jamais réussi à comprendre pourquoi.
StrongBad
2
GDM n'est pas un processus de signalisation. GDM est essentiellement un moyen stupide de connecter Xorg et PAM. le vrai coupable est gnome-session.
strugee

Réponses:

2

Pour éteindre gracieusement votre bureau, vous devrez peut-être augmenter le TimeoutStopSec=pour GDM, ou tout autre gestionnaire d'affichage que vous utilisez.

CameronNemo
la source
Il me semble que GDM n'aurait jamais dû dire à systemd de fermer en premier lieu s'il ne savait pas si tous les clients pouvaient être fermés.
EnigmaticPhysicist
2

Cela a fonctionné pour moi sur mon Arch Linux avec Gnome 3.12. Il s'est avéré que cela pouvait être lié à la configuration /etc/gdm/PostSession/Default.

  1. Exécutez sudo pacman -S wmctrlpour installer wmctrl pour la gestion des fenêtres.

  2. Créez un fichier exécutable pour fermer toutes les fenêtres. Par exemple, je l'ai mis /home/[your_username]/bin/close-all-windowsavec ces contenus:

    #!/bin/sh
    wmctrl -l | while read -r line
    do
        wmctrl -c `echo "$line" | sed 's/.*  [0-9]* [your_hostname] //'`
    done
    
  3. Modifiez /etc/gdm/PostSession/Defaultet ajoutez ces contenus avant exit 0:

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

J'espère que cela fonctionnera.

sorpaas
la source
Pour Plasma 5, mettre ce script dans .config / plasma-workspace / shutdown / résout le problème
AF7
-1

Le script wmctrl de sorpass fonctionne bien pour moi (sur CentOS 7, je devais d'abord lancer 'yum install wmctrl'). Cependant, j'ai trouvé que / etc / gdm / PostSession / Default ne semblait s'exécuter qu'à la déconnexion, pas à l'arrêt. Par conséquent, au lieu d'utiliser / etc / gdm / PostSession / Default, j'appelle maintenant le script wmctrl de sorpass à partir du script python de Seamus Phelan qui se trouve sur ces deux sites:

Cette combinaison de scripts fonctionne très bien pour fermer Firefox, Chrome, etc. automatiquement et proprement lorsque je me déconnecte ou arrête ma machine de bureau CentOS 7. Notez qu'avec CentOS 7, vous devez exécuter 'yum install gnome-python2-gnome' pour que ce script python fonctionne.

Jim
la source