Introducción
En el día a día de un administrador de sistemas o un desarrollador, es frecuente encontrarse con comandos que pueden tardar más de lo esperado o quedar bloqueados esperando entrada que nunca llega. Para evitar que estos procesos consuman recursos indefinidamente, Linux ofrece la herramienta timeout. Este comando permite establecer un límite de tiempo máximo para la ejecución de cualquier otro programa, enviando una señal de terminación cuando se agota el tiempo. En este artículo veremos cómo funciona, su sintaxis, las opciones más útiles y varios ejemplos prácticos que puedes aplicar inmediatamente en tu entorno.
¿Qué es timeout?
El comando timeout pertenece al paquete coreutils y está disponible en prácticamente todas las distribuciones Linux modernas. Su función principal es ejecutar un comando especificado y finalizarlo si supera un período de tiempo determinado. Cuando el tiempo se agota, timeout envía por defecto la señal SIGTERM al proceso hijo; si el proceso no responde, se puede forzar el envío de SIGKILL después de un intervalo adicional.
Sintaxis básica
La forma más simple de usar timeout es:
timeout duración comando [argumentos]
La duración puede expresarse en segundos (valor predeterminado), minutos con el sufijo m, horas con h o días con d. Por ejemplo, 10s, 5m o 1h30m son válidos.
Opciones más utilizadas
-s señalo--signal=señal: especifica la señal que se enviará cuando se agote el tiempo (por ejemplo, -s SIGKILL).-k tiempoo--kill-after=tiempo: después de enviar la señal inicial, espera este intervalo antes de enviar SIGKILL si el proceso aún está activo.--preserve-status: devuelve el código de salida del comando ejecutado, incluso si fue terminado por timeout.--foreground: cuando el comando se ejecuta en segundo plano, timeout espera a que termine en primer plano.
Ejemplos prácticos
A continuación se presentan varios escenarios donde timeout resulta especialmente útil.
Limitar una descarga con wget
Supongamos que queremos descargar un archivo grande pero no queremos que la operación se prolongue más de diez minutos:
timeout 10m wget -c https://ejemplo.com/archivo grande.iso
Si la descarga no termina en diez minutos, timeout enviará SIGTERM a wget, intentando finalizar la transferencia de forma limpia.
Ejecutar una prueba de red con ping
Un ping continuo puede consumir salida indefinidamente. Para obtener solo diez paquetes y luego detenerse, podemos combinar timeout con ping:
timeout 5s ping -i 1 google.com
Esto hará que ping se ejecute durante cinco segundos aproximadamente, enviando un paquete por segundo.
Probar un script que podría quedar bloqueado
Imagina un script de respaldo que, bajo ciertas condiciones, se queda esperando una cinta que no está disponible:
timeout 30m ./backup.sh
Si el script supera los treinta minutos, será detenido y podrás revisar los logs para identificar la causa del retraso.
Combinar con la opción –kill-after
En algunos casos, un proceso ignora SIGTERM y necesita una señal más fuerte. Con –kill-after puedes especificar un intervalo de gracia:
timeout -s SIGTERM --kill-after=30s 2m ./proceso_lento
aquí, tras dos minutos se envía SIGTERM; si después de treinta segundos el proceso sigue vivo, se envía SIGKILL.
Casos de uso típicos
- Evitar que trabajos cron se ejecuten demasiado tiempo y afecten el rendimiento del servidor.
- Limitar el tiempo de ejecución de pruebas automatizadas en entornos de integración continua.
- Controlar la duración de comandos interactivos que podrían esperar entrada del usuario indefinidamente.
- Garantizar que scripts de despliegue no se queden colgados esperando respuestas de servicios externos.
Consideraciones y limitaciones
Aunque timeout es muy útil, hay algunos puntos a tener en cuenta:
- El tiempo cuenta desde el inicio del proceso; si el proceso genera hijos que se desvinculan (por ejemplo, mediante fork y setsid), esos hijos pueden continuar ejecutándose después de que timeout haya terminado al padre.
- Algunos programas manejan señales de forma personalizada y pueden ignorar SIGTERM; en esos casos es necesario usar -s SIGKILL o combinar con –kill-after.
- El código de salida de timeout es 124 cuando el comando es terminado por exceder el tiempo; de lo contrario, devuelve el código de salida del comando ejecutado (a menos que se use –preserve-status).
- En entornos muy restringidos (como contenedores sin coreutils completo) podría no estar disponible; en tal caso, se puede recurrir a soluciones basadas en alarmas de señales o herramientas como expect.
Conclusión
El comando timeout es una herramienta sencilla pero poderosa para añadir un límite de tiempo a cualquier proceso en Linux. Ya sea que necesites evitar descargas interminables, controlar pruebas automatizadas o asegurar que tus scripts no se queden bloqueados, timeout brinda una forma fiable y configurable de intervenir. Conociendo sus opciones básicas y avanzadas, puedes incorporarlo fácilmente en tus flujos de trabajo diarios y mejorar la estabilidad y previsibilidad de tus sistemas.