Ubuntu no está enviando SIGTERM al apagar


21

Estoy empezando a sospechar que Ubuntu no le está diciendo a las aplicaciones en ejecución que se está cerrando para permitir que se cierren correctamente, sino que las obliga a hacerlo.

Si dejo Chrome abierto cuando lo apago, dice que no se cerró correctamente la última vez que lo abro después del arranque, LibreOffice no me pregunta si quiero guardar mi documento y estoy creando una aplicación que necesita ejecutar algún código en la salida, pero no está permitido hacerlo cuando la computadora está apagada.

Tal como lo he entendido, SIGTERM se envía primero a todos los procesos para permitirles salir limpiamente y, si no salen, SIGKILL se envía para obligarlos a abandonar. Parece que Ubuntu no está enviando SIGTERM en absoluto o no le da a las aplicaciones el tiempo suficiente antes de enviar SIGKILL.

¿Hay alguna manera de arreglar esto?

Estoy ejecutando Ubuntu 16.04 pero el problema también existía en 15.10. No puedo decir si estaba allí antes desde que comencé a usar Ubuntu cuando 15.10 era la versión más nueva.

Editar: uso Unity y apago mi computadora presionando el engranaje en la esquina superior derecha y seleccionando apagar, aunque el problema es el mismo si se ejecuta sudo halten la terminal.

Editar: estoy observando el mismo comportamiento cuando solo estoy cerrando sesión. Supongo que se supone que la señal se debe enviar al cerrar sesión y, por lo tanto, el problema surge al apagar y cerrar sesión.


¿Cómo te estás cerrando?
terdon

1
Chromium y LibreOffice no manejan SIGTERM de la forma en que le gustaría que se maneje
Andrea Corbellini

2
No estoy seguro de entender lo que quieres decir. ¿Quiere decir que no están manejando SIGTERM correctamente? Tal vez no, pero como escribí en mi pregunta, estoy trabajando en un programa que maneja SIGTERM pero ese código nunca parece ejecutarse. SIGINT mientras presiona ctrl + C funciona perfectamente. Todavía creo que hay algún problema con respecto a que Ubuntu notifica los procesos en ejecución al apagarse.
GKraft


2
Es molesto tener que cerrar todas las aplicaciones manualmente, y ¿qué pasa si olvida una minimizada? No salvará tu trabajo. Y hay muchos procesos en segundo plano que no puedes controlar fácilmente o en los que no piensas. No se les dará la oportunidad de limpiar después de sí mismos o guardar lo que sea que estén haciendo.
GKraft

Respuestas:


3

Desafortunadamente, no funciona de esta manera. Muchos de esos programas que realmente tienen un controlador de señal, no bloquean la señal para mostrar un diálogo de confirmación. El manejo de la señal a menudo es mínimo o falta.

Puede probarlo fácilmente sin tener que apagarlo. Simplemente envíe SIGTERM a su proceso de ejecución de Firefox o LibreOffice:

$ pkill firefox

Normalmente, Firefox puede preguntarte si realmente quieres cerrarlo. Además, generalmente tarda un tiempo en cerrarse, especialmente cuando se ha estado ejecutando durante mucho tiempo y utilizando más de 1 GB de RAM; a menudo, el proceso tarda aproximadamente un minuto en finalizar después de que se haya cerrado su última ventana. Nada de esto sucede cuando envía SIGTERM, el proceso finaliza instantáneamente.

Sin embargo, algunos entornos de escritorio cierran todas las ventanas abiertas antes de apagarse. A diferencia de SIGTERM, cerrar una ventana mediante programación es como hacer clic en el botón X de esa ventana, o Alt+ F4. Esto también es lo que hace el script en la otra respuesta: usa wmctrl para cerrar todas las ventanas abiertas con gracia.

Cuando se cierra una ventana, el programa no tiene prisa y puede cerrar todo dentro de esa ventana, por ejemplo abrir pestañas, y también puede mostrar una ventana de diálogo si no hay trabajo guardado. Una vez que se han cerrado todas las ventanas abiertas de una aplicación, el proceso generalmente finaliza poco después.

Por lo tanto, depende de su entorno de escritorio (suponiendo que utilice su entorno de escritorio para apagarse y no sudo poweroff). Por ejemplo, KDE debería esperar a que se cierren las ventanas abiertas antes de apagarse, mientras que MATE no.

En pocas palabras: cierre todas las ventanas abiertas manualmente antes de cerrar. O utilice un entorno de escritorio que espere a que se cierren todas las ventanas.


Veo que el proceso de apagado y el manejo de la señal no funcionaron exactamente como pensaba. Ahora entiendo cómo se supone que funciona y por qué no funcionó como esperaba.
GKraft

0

Por lo que vale, hace algún tiempo, encontré este procedimiento en el foro de Manjaro:

close_apps () {
WIN_IDs=$(wmctrl -l | grep -vwE "Desktop$|xfce4-panel$" | cut -f1 -d' ')
for i in $WIN_IDs; do wmctrl -ic "$i"; done

# Keep checking and waiting until all windows are closed
while [ "$WIN_IDs" != "" ]; do
        sleep 0.1;
        WIN_IDs=$(wmctrl -l | grep -vwE "Desktop$|xfce4-panel$" | cut -f1 -d' ')
done

}

Puede llamarlo en un script propio para cerrar todas las aplicaciones abiertas antes de cerrar (o reiniciar).

El único problema es que se creó para Xfce, por lo que necesita los cambios que Unity DE impone. Una pequeña ayuda de alguien con más conocimientos vendría muy bien aquí para ayudar a resolver el problema de OP.


No tendré acceso a mi computadora por un par de días, así que no puedo probarlo incluso si está corregido. ¿Debería ser realmente necesario usar tal script? Creo que Ubuntu debería manejarlo solo.
GKraft

Convenido. Sin embargo, funciona perfectamente en Xubuntu. Por ejemplo, el apagado esperará indefinidamente si hay un documento no guardado.
SR

0

En realidad, una parte del script que cierra todas las ventanas y no depende de ningún DE en particular está disponible en Ask. Las respuestas 2 y 3 son particularmente útiles. Con solo unas pocas líneas más, y al crear un lanzador en el panel o en el escritorio, puede lograr el apagado elegante que funciona en el DE que está utilizando.

Cómo cerrar todas las ventanas abiertas con gracia


Parecen prometedores. Probablemente termine usando un script similar.
GKraft
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.