Historial de la pregunta:
Perl fue creado como un lenguaje para scripts de sistema, por lo que el manejo de señales (SIGTERM, SIGINT, SIGHUP) siempre ha sido una capacidad incorporada y poderosa. Este sistema permite interceptar eventos externos (detención del usuario, reinicio de demonios, tiempos de espera) y finalizar o modificar el comportamiento de los scripts de manera adecuada.
Problema:
El manejo incorrecto de señales es una causa común de finalización incorrecta o bloqueo de scripts, pérdida de datos en caso de finalización inesperada, o la imposibilidad de reiniciar procesos sin perder estado o recursos.
Solución:
Las señales se manejan mediante la instalación de manejadores en un hash especial %SIG. Una buena práctica es el minimalismo de las acciones dentro del manejador de señales (por ejemplo, establecer una bandera y finalizar de manera segura en el hilo principal). Para un funcionamiento correcto en hilos y en el manejo múltiple de señales, se utilizan módulos especializados (por ejemplo, POSIX::sigaction).
Ejemplo:
my $term = 0; $SIG{TERM} = sub { $term = 1; }; while (1) { last if $term; # trabajo principal } print "Cierre ordenado ";
Características clave:
¿Se puede usar print/IO dentro del manejador de señales?
Respuesta: ¡No se recomienda! Ocurrirá un mal funcionamiento y se puede perder información. El estándar moderno es un código mínimo (solo establecimiento de banderas/limpieza de variables).
¿Qué sucederá si no se restablece el manejador de señales después de la primera activación?
Respuesta: El manejador se ejecutará muchas veces si la señal se recibe nuevamente. Si se requiere reacción solo al primer evento, el manejador debe restablecer $SIG{...} o enviarse señales a sí mismo.
¿Es el manejo de señales seguro para hilos en Perl?
Respuesta: ¡No! En el Perl multihilo, los manejadores de señales solo se invocan en el hilo principal (el intérprete principal); dentro de los hilos, las señales pueden ser completamente ignoradas o mal procesadas.
Un proceso demonio al recibir SIGTERM cierra de inmediato todos los descriptores de archivo y elimina archivos temporales en el manejador — de vez en cuando los archivos no se eliminan, se pierden datos.
Ventajas:
Desventajas:
El manejador de señal SIGTERM solo establece la variable $exit, después de lo cual el ciclo principal finaliza cuidadosamente su trabajo, cierra archivos y solo entonces libera recursos.
Ventajas:
Desventajas: