He notado que con Fedora 17, una operación de apagado (por ejemplo, apagado -h ahora) se ha vuelto mucho más rápida (se siente como 2 segundos como máximo). Entonces me pregunto si los procesos en ejecución finalizan correctamente. Especialmente en Fedora (de nuevo, unos 2 segundos), difícilmente puedo imaginar que cada proceso tenga tiempo suficiente para finalizar.
Supongo que el usuario ha cerrado todos los procesos de usuario (manualmente) antes de emitir el comando de apagado, por lo que solo quedan los servicios del sistema (aún así, es posible que también tengan cosas que hacer al salir).
Así que escribí un pequeño programa que capta la mayoría de las señales y, si se proporciona una cantidad (de segundos), esperará antes de salir. Aparte de eso, no hace nada. Luego, primero en un sistema Debian, lo inicié con un retraso de 60 segundos. Cuando recibió un SIGHUP (supongo que su shell principal ha finalizado), comenzó la cuenta regresiva de 60 segundos. Después de 10 segundos, recibió un SIGTERM amistoso. Mi programa ignoró esta señal y continuó la cuenta regresiva, hasta el segundo 40, cuando murió trágicamente. Entonces, 20 segundos después de que se le dijo que terminara (SIGHUP), se le dio SIGKILL.
Ahora la misma prueba en Fedora 17 (3.5.3-1.fc17.x86_64):
Señal captada 1.
Tiempo de ejecución: 8 segundo(s)
Retrasando la terminación durante 60 segundo(s)...
60...
Señal captada 15 - ¡ignorando!
59...
58...
Ni siquiera un segundo después del SIGHUP, recibe el SIGTERM. Un programador puede retrasar la finalización de su programa después de un SIGTERM, para finalizar trabajos, guardar configuraciones, etc. (a diferencia de, tal vez, después de un SIGINT). Mi programa tiene 2 segundos antes de que se elimine.
¿Qué pasa si un proceso en ejecución se interrumpe mientras se guardan algunas configuraciones (¿un archivo de configuración dañado?) o algún tipo de demonio (por ejemplo, algún servidor de archivos) está escribiendo datos almacenados en caché en el disco (¿datos corruptos?).
Respuesta1
Los servicios pueden especificar cómo quieren que se les rescinda en su *.service
expediente. Puede seleccionar el tiempo de espera que desee, no es necesario que viva con el predeterminado. Si tiene postgreSQL o mysqld instalado, mire sus archivos de servicio para ver cómo organizan un apagado limpio.