Apagado elegante en ArchLinux

21

Estoy tratando de obtener un apagado / reinicio elegante en ArchLinux con GNOME Shell. Ahora, cuando solicito el apagado, se apaga inmediatamente sin dar tiempo a los programas abiertos para cerrar / guardar con gracia los archivos abiertos. Como resultado, cada vez que reinicio Chrome (por ejemplo), me dice que la sesión no se cerró correctamente, etc. Al leer en la web, aprendí que systemd al cerrar procesos, primero envía un mensaje SIGTERMseguido por SIGKILLsi el proceso no se cierra dentro de un tiempo de espera determinado. Sin embargo, me doy cuenta de que en mi sistema SIGKILLse envía inmediatamente después SIGTERMy supongo que esta es la causa de la finalización de los programas no graciosos.

He encontrado alguna documentación que (si la leo correctamente) establece que el tiempo de espera antes del envío SIGKILLse puede configurar por TimeoutStopSec=opción. También el envío SIGKILLtambién podría deshabilitarse por SendSIGKILL=opción. Pero no puedo encontrar dónde configurar esas opciones ... ¿hay un archivo de configuraciones de apagado / reinicio de systemd donde pueda configurar esas opciones?

EDITAR:

Hice algunas pruebas y descubrí dos cosas interesantes:

  1. Si cierro manualmente Chrome de esta manera killall -SIGTERM chrome, no se quejará de que no se ha cerrado correctamente la próxima vez que lo inicie nuevamente. Si lo cierro así killall -SIGKILL chrome, se quejará. Esto me dice que Chrome está manejando SIGTERM correctamente.
  2. Mirando el resultado de mi procedimiento de apagado, systemd imprime Sending SIGTERM...inmediatamente seguido deSending SIGKILL...

Según el comentario a continuación, systemd está manejando sus procesos solamente. Entonces en mi caso GDM. Esto me dice que el problema podría ser:

  1. GDM no cierra sus procesos secundarios (por ejemplo, Chrome) correctamente (es decir, enviándoles SIGTERM)
  2. o systemd está enviando a GDM un mensaje SIGKILL a principios de no darle el tiempo para cerrar correctamente sus elementos secundarios.

¿Hay alguna manera de verificar / configurar cómo GDM realmente cierra a sus hijos?

lviggiani
fuente
1
Systemd solo señala procesos directamente bajo su control. Cosas como el cromo no son uno de esos procesos. Systemd le indicará a su administrador de pantalla (xdm, gdm, kdm, lo que sea), entonces depende del administrador de pantalla señalar a sus hijos, y así sucesivamente hasta llegar a Chrome. Si nada indica Chrome, muere cuando el servidor xorg se apaga y su pantalla desaparece.
Patrick
@Patrick: gracias, supongo que sí. Es por eso que intenté agregar 'TimeoutStopSec = 90s' a la sección '[Servicio]' de '/etc/systemd/system/display-manager.service' de acuerdo con esto: freedesktop.org/software/systemd/man/systemd.service. html pero nada cambia ... :(
lviggiani 01 de
Chrome debería estar bajo systemd'scontrol, systemdes decir pid 1, pero Chrome se ejecuta fuera de su secuencia de comandos de envoltura en una subshell e invoca procesos secundarios después. Aún así, hará lo que sea necesario para eliminarlo zygotessiempre que su sistema esté configurado correctamente. ¿Estás usando una de esas soluciones de espacio temporal para Chrome que encontrarás recomendadas en la wiki de Arch?
mikeserv
1
Me encuentro con un problema similar con KDE y Firefox en Arch. Nunca he llegado a tratar de averiguar por qué.
StrongBad
2
GDM no es procesos de señalización. GDM es esencialmente una forma tonta de conectar Xorg y PAM. El verdadero culpable es gnome-session.
strugee

Respuestas:

2

Para apagar su escritorio con gracia, es posible que necesite aumentar el TimeoutStopSec=GDM o cualquier otro administrador de pantalla que esté utilizando.

CameronNemo
fuente
Me parece que GDM nunca debería haberle dicho a systemd que se cerrara si no supiera si todos los clientes podrían cerrarse.
enigmaticPhysicist
2

Esto funcionó para mí en mi Arch Linux con Gnome 3.12. Resultó que puede estar relacionado con la configuración en /etc/gdm/PostSession/Default.

  1. Ejecute sudo pacman -S wmctrlpara instalar wmctrl para la gestión de Windows.

  2. Cree un archivo ejecutable para cerrar todas las ventanas. Por ejemplo, lo puse /home/[your_username]/bin/close-all-windowscon estos contenidos:

    #!/bin/sh
    wmctrl -l | while read -r line
    do
        wmctrl -c `echo "$line" | sed 's/.*  [0-9]* [your_hostname] //'`
    done
    
  3. Modifique /etc/gdm/PostSession/Defaulty agregue estos contenidos antes de exit 0:

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

Espero que esto funcione.

sorpaas
fuente
Para Plasma 5, poner este script en .config / plasma-workspace / shutdown / resuelve el problema
AF7
-1

El script wmctrl de sorpass funciona bien para mí (en CentOS 7 solo tenía que ejecutar 'yum install wmctrl' primero). Sin embargo, descubrí que / etc / gdm / PostSession / Default solo parecía ejecutarse solo al cerrar sesión, no al apagarse. Por lo tanto, en lugar de usar / etc / gdm / PostSession / Default, ahora llamo al script wmctrl de sorpass del script python de Seamus Phelan que se puede encontrar en estos dos sitios:

Esta combinación de scripts funciona muy bien para cerrar Firefox, Chrome, etc. de forma automática y limpia cuando salgo o apago mi máquina de escritorio CentOS 7. Tenga en cuenta que con CentOS 7 debe ejecutar 'yum install gnome-python2-gnome' para que este script de Python funcione.

Jim
fuente