
He visto muchos administradores de procesos que intentan hacer esto. Tenía entendido que solo deberías usar SIGTERM para finalizar un proceso. El proceso podría tardar una cantidad de tiempo desconocida en limpiarse; en un sistema lento, podría tardar unos minutos. Siempre pensé que la única solución era ser paciente y esperar a que el programa se limpiara y saliera correctamente. Si el proceso no detecta los SIGTERM, entonces se trata de un error y se debe informar al responsable del mantenimiento del software.
He visto herramientas populares como Docker que también intentan hacer esto:
Uso: parada de la ventana acoplable [OPCIONES] CONTENEDOR [CONTENEDOR...]
Detener un contenedor en ejecución (enviar SIGTERM y luego SIGKILL después del período de gracia)
¿Es esta una mala práctica? Una cosa que también me interesa es cómo funciona el procedimiento de apagado en un sistema de inicio estilo SystemV. He echado un vistazo a algunas páginas de manual y algunas otras preguntas, pero no puedo encontrar una respuesta definitiva. Supongo que cada servicio de inicio (¿terminología?) ve el cambio en el nivel de ejecución y ejecuta la función de "detención" adecuada como se define en el script de inicio. ¿Lo hace uno por uno, asegurándose de que cada servicio finalice correctamente? ¿Qué sucede con los procesos que no manejan los scripts de inicio? He visto algunas preguntas que mencionan vagamente el uso de un período de gracia antes de SIGKILL, pero esperaba que alguien pudiera dar más detalles o al menos indicarme la dirección correcta. :)
Si alguien pudiera ayudarme a descubrir más sobre cómo funciona esto con systemd, estaría encantado de investigar y descubrir más. He echado un vistazo a las páginas de manual pero tampoco encuentro nada definitivo aquí.
Respuesta1
Puedes quedarte con tu pastel o comértelo. El programa quiere tener todo el tiempo que necesite (o quiera) para reaccionar al SIGTERM. El sistema (administrador del programa) quiere poder finalizar. Si el sistema espera una eternidad, esto permite que un programa se apodere del cierre del sistema sin responder nunca (ya sea porque el programa es malicioso o porque tiene errores).
En una secuencia de apagado normal, cada demonio se finaliza mediante un script de inicio (llámelo script de apagado si lo desea) proporcionado por el autor o el empaquetador del demonio. Dependiendo del demonio, el script de inicio puede simplemente enviarle una señal o puede realizar un apagado más controlado (por ejemplo, escribiendo en un socket). El script de inicio puede esperar a que el demonio informe que se ha cerrado satisfactoriamente o puede matarlo por la fuerza. Los scripts de inicio se ejecutan como root (pueden llamar su
para realizar parte de su tarea como usuario menos privilegiado); se supone que deben cooperar, por lo que se les permite dejar el sistema colgado para siempre.
Una vez que los scripts de inicio hayan terminado su trabajo, se supone que todos los servicios deben cerrarse. Se supone que cualquier proceso restante no es importante o se comporta mal. Entonces, en esta etapa se les dice a los procesos restantes que se cierren (SIGTERM), y después de un período de gracia (que les da una última oportunidad de cerrarse limpiamente), el sistema debe cerrarse para que los procesos restantes se eliminen a la fuerza (SIGKILL).
Piense en los guiones de inicio como el procedimiento de arresto normal: mostrar órdenes judiciales, gritar una advertencia, etc. Un demonio respetuoso de la ley debería cerrarse en este punto, aunque los demonios tienen abogados (los guiones de inicio) que pueden retrasar el procedimiento mientras desear. Una vez finalizado el proceso normal, los demonios restantes se presumen hostiles. El sistema dispara un disparo de advertencia (SIGTERM) y luego, después de un retraso, dispara a SIGKILL.