Comando timeout de Linux
Manual completo de comandos de Linux
timeout es un comando útil del sistema Linux que se utiliza para terminar un comando en ejecución después de un tiempo especificado. Este comando es especialmente adecuado para los siguientes escenarios:
- Limitar procesos de larga duración
- Evitar que scripts o programas se ejecuten indefinidamente
- Establecer un límite de tiempo máximo para operaciones críticas
- Control de tiempo de espera en pruebas automatizadas
El comando timeout forma parte del paquete GNU coreutils y viene preinstalado en la mayoría de las distribuciones de Linux.
Sintaxis del comando
El formato de sintaxis básico del comando timeout es el siguiente:
timeout [选项] 持续时间 命令 [参数...]
Descripción de parámetros
-
Duración:
- Puede ser un número solo (la unidad predeterminada es segundos)
- También se puede especificar la unidad:
10s(10 segundos),5m(5 minutos),1h(1 hora) - Admite decimales:
0.5s(500 milisegundos),1.5m(1 minuto 30 segundos)
-
Comando:
- El comando o programa a ejecutar
- Puede ser un comando integrado o un programa externo
-
Argumentos:
- Argumentos pasados al comando
Opciones comunes
| Opción | Descripción | Ejemplo |
|---|---|---|
-so--signal |
Señal enviada después del tiempo de espera (por defecto TERM) | timeout -s KILL 5s command |
-ko--kill-after |
Si la señal inicial no es efectiva, envía la señal KILL después del tiempo especificado | timeout -k 5s 10s command |
--preserve-status |
Devuelve el estado de salida del comando terminado | timeout --preserve-status 5s command |
--foreground |
Ejecuta el comando en primer plano (por defecto en segundo plano) | timeout --foreground 5s command |
-vo--verbose |
Muestra una salida detallada | timeout -v 5s command |
Ejemplos de uso
Uso básico
Ejemplo
timeout 5s ping example.com
# Termina la ejecución del script después de 1 minuto
timeout 1m ./long_script.sh
Especificar el tipo de señal
Ejemplo
timeout -s INT 3s command
# Envía la señal KILL después de 10 segundos (terminación forzada)
timeout -s KILL 10s command
Uso combinado
Ejemplo
timeout -k 5s 10s command
Obtener el estado de salida
Ejemplo
timeout --preserve-status 5s command
echo $? # Ver el código de estado de salida
Escenarios de aplicación práctica
1. Evitar la ejecución infinita de scripts
Ejemplo
timeout 2h ./backup_database.sh
2. Control de tiempo de espera en pruebas automatizadas
Ejemplo
timeout 30s ./run_test_case.sh
3. Tiempo de espera en operaciones de red
Ejemplo
timeout 1m wget http://example.com/large_file.zip
4. Manejo de tiempo de espera para programas interactivos
Ejemplo
timeout 10s read -p "Por favor, introduzca su selección: " choice
Precauciones
-
Manejo de señales:
- Algunos programas pueden capturar e ignorar la señal TERM; en ese caso, es necesario usar la señal KILL
- Se debe usar la señal KILL con precaución en operaciones con datos importantes, ya que puede provocar corrupción de datos
-
Manejo de procesos hijos:
- Por defecto, timeout solo termina el proceso iniciado directamente; no necesariamente termina todos los procesos hijos
- Si se necesita terminar todo el árbol de procesos, se puede considerar combinar con
killel comando
-
Precisión de tiempo:
- La precisión de tiempo del kernel de Linux suele ser de nivel de milisegundos
- Tiempos muy cortos (como 0.001s) pueden no controlarse con precisión
-
Valor de retorno:
- Si el comando se completa antes del tiempo de espera, devuelve el estado de salida del comando
- Si se termina por tiempo de espera, devuelve 124
- Si timeout mismo falla, devuelve 125-128
Técnicas avanzadas
1. Combinar con otros comandos
Ejemplo
timeout 30s command || echo "El comando ha superado el tiempo de espera, ejecutando la limpieza..."
2. Uso en scripts
Ejemplo
if timeout 10s command; then
echo "El comando se completó correctamente"
else
echo "El comando superó el tiempo de espera o falló"
fi
3. Monitoreo del uso de recursos
Ejemplo
(ulimit -t 10; timeout 20s command)
Preguntas frecuentes
Q1: ¿Cuál es la diferencia entre timeout y sleep?
A: sleep simplemente espera un tiempo especificado, mientras que timeout limita el tiempo de ejecución de otro comando.
Q2: ¿Cómo terminar todos los procesos hijos iniciados por timeout?
A: Se puede usar el método de grupo de procesos:
timeout --foreground 10s sh -c 'command & wait'
Q3: ¿Por qué mi programa no termina inmediatamente después del tiempo de espera?
A: Puede ser porque el programa capturó la señal TERM predeterminada; intente usar-s KILLla opción.
Q4: ¿Cómo saber si un comando terminó debido al tiempo de espera?
A: Compruebe si el código de estado de salida es 124:
Ejemplo
if [ $? -eq 124 ]; then
echo "El comando se terminó por tiempo de espera"
fi
Resumen
El comando timeout es una herramienta muy útil en la administración de sistemas Linux; nos ayuda a:
- Controlar el tiempo de ejecución de los programas, evitando que los recursos sean ocupados durante mucho tiempo
- Mejorar la robustez de los scripts, evitando esperas infinitas
- Implementar mecanismos de tiempo de espera en tareas automatizadas
- Manejar operaciones con tiempos de ejecución impredecibles
Al usar adecuadamente el comando timeout, puede hacer que la administración de su sistema Linux sea más eficiente y confiable.
Otras extensiones