Capturar SIGINT y SIGTERM con trap en Bash: Limpieza controlada y salida segura
Introducción
¿Alguna vez has ejecutado un script en terminal y has querido que, en lugar de terminarlo abruptamente al presionar Ctrl+C, haga algo antes de salir? O tal vez, cuando reciba una señal de terminación como SIGTERM, realice limpieza antes de finalizar? Ese es el propósito de las señales en sistemas Unix-like, y la herramienta trap en Bash es clave para manejarlas.
Este tutorial está dirigido a desarrolladores o usuarios avanzados de terminal que quieran dominar el manejo de señales para garantizar que sus scripts salgan de forma controlada. Aprenderás a usar trap para capturar señales como SIGINT (generada por Ctrl+C) y SIGTERM (enviada por kill), realizar tareas de limpieza (como cerrar archivos o bases de datos) y salir con elegancia.
Al finalizar, tendrás ejemplos prácticos, salida esperada y buenas prácticas para evitar errores comunes.
¿Qué son SIGINT y SIGTERM?
SIGINT: La señal de interrupción por teclado
SIGINT es la señal que se envía cuando presionas Ctrl+C en la terminal. Su función principal es interruptar processes que están en ejecución. Por ejemplo, si tienes un bucle infinito en tu script, Ctrl+C lo detendrá.
SIGTERM: La señal de terminación suave
SIGTERM es una señal que se envía para indicar que un proceso debe terminar. A diferencia de SIGKILL (que no puede ser capturada), SIGTERM permite al proceso realizar acciones de limpieza antes de salir. Es la señal predeterminada cuando usas kill sin argumentos.
Desarrollo: Usando trap para capturar señales
La herramienta trap en Bash permite definir acciones a realizar cuando se recibe una señal específica. Su sintaxis básica es:
trap 'comando' señalDonde comando es la acción a ejecutar y señal es el nombre o número de la señal (como SIGINT o SIGTERM).
Ejemplo 1: Capturar SIGINT (Ctrl+C)
Vamos a crear un script que simule una tarea en segundo plano y responda a Ctrl+C.
#!/bin/bash
# Función de limpieza
limpia() {
echo "Capturado Ctrl+C. Realizando limpieza..."
# Aquí podrías cerrar archivos, liberar recursos, etc.
exit 0
}
# Establece el trap para SIGINT
trap 'limpia' SIGINT
# Simulación de tarea
while true; do
echo "Trabajando..."
sleep 1
doneSalida esperada:
Trabajando...
Trabajando...
^C
Capturado Ctrl+C. Realizando limpieza...Este script entra en un bucle infinito. Al presionar Ctrl+C, se ejecuta la función limpia, que imprime un mensaje y sale con código 0.
Ejemplo 2: Capturar SIGTERM
Ahora, modificaremos el script para que también responda a SIGTERM. Esto es útil si el script es terminado por kill.
#!/bin/bash
limpia() {
echo "Recibido SIGTERM. Limpieza en proceso..."
exit 0
}
trap 'limpia' SIGINT SIGTERM
while true; do
echo "Ejecutando..."
sleep 1
doneSalida esperada al hacerlo con kill:
Ejecutando...
Ejecutando...
$ kill <pid>
Recibido SIGTERM. Limpieza en proceso...En este caso, al enviar kill al proceso, se activa el trap para SIGTERM y se ejecuta la limpieza.
Buenas prácticas y errores comunes
1. No bloquees el trap
Evita que el trap interfiera con otras señales. Por ejemplo, si tienes múltiples traps, asegúrate de que no se cancelen entre sí.
trap 'echo SIGINT' SIGINT
unshift 'echo SIGTERM' SIGTERM # Esto no es válido en BashEn Bash, no puedes usar unshift para modificar el array de traps. En su lugar, usa trap - para desactivar un trap.
2. Limpieza exitosa
Siempre asegúrate de que la acción de limpieza termine con exit o return para evitar que el script siga ejecutándose en segundo plano.
3. Manejo de múltiples señales
Puedes capturar varias señales en un solo trap, como en los ejemplos anteriores. Esto es útil para situaciones donde se requiere la misma acción para múltiples señales.
trap 'limpia' SIGINT SIGTERM4. Pruebas en entornos controlados
Antes de usar trap en producción, prueba en un entorno seguro. Por ejemplo, ejecuta el script en un terminal y prueba con kill o Ctrl+C para verificar que todo funcione.
Conclusión
Manejar señales como SIGINT y SIGTERM con trap es esencial para escribir scripts robustos y profesionales. Al capturar estas señales, puedes garantizar que tu aplicación realice limpieza antes de salir, evitando errores de estado o pérdida de datos.
- ¿Qué aprendiste? Cómo usar
trappara capturar señales, realizar limpieza y salir de forma controlada. - Próximos pasos: Explora otras señales (como SIGUSR1) o integra este patrón en aplicaciones más complejas, como servicios en Node.js o Python.
Si quieres profundizar, podrías probar a capturar señales en scripts que interactúan con bases de datos o APIs, asegurando que siempre se cierre la conexión correctamente.
DUGLAS MORENO
Comentarios (0)
Sé el primero en comentar.