Comando timeout de Linux

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

  1. 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)
  2. Comando:

    • El comando o programa a ejecutar
    • Puede ser un comando integrado o un programa externo
  3. 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

# Termina el comando ping después de 5 segundos
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

# Envía la señal INT después de 3 segundos (equivalente a Ctrl+C)
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

# Primero envía la señal TERM y, después de 5 segundos, envía la señal KILL
timeout -k 5s 10s command

Obtener el estado de salida

Ejemplo

# Conserva el estado de salida del comando terminado
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

# Limita el script de respaldo de la base de datos a un máximo de 2 horas
timeout 2h ./backup_database.sh

2. Control de tiempo de espera en pruebas automatizadas

Ejemplo

# El caso de prueba se ejecuta como máximo durante 30 segundos
timeout 30s ./run_test_case.sh

3. Tiempo de espera en operaciones de red

Ejemplo

# Intenta descargar el archivo durante un máximo de 1 minuto
timeout 1m wget http://example.com/large_file.zip

4. Manejo de tiempo de espera para programas interactivos

Ejemplo

# Da al usuario un máximo de 10 segundos para introducir su selección
timeout 10s read -p "Por favor, introduzca su selección: " choice

Precauciones

  1. 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
  2. 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 conkillel comando
  3. 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
  4. 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

# Realizar operaciones de limpieza después del tiempo de espera
timeout 30s command || echo "El comando ha superado el tiempo de espera, ejecutando la limpieza..."

2. Uso en scripts

Ejemplo

#!/bin/bash

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

# Limitar el tiempo de CPU (requiere combinar con ulimit)
(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

timeout 5s slow_command
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:

  1. Controlar el tiempo de ejecución de los programas, evitando que los recursos sean ocupados durante mucho tiempo
  2. Mejorar la robustez de los scripts, evitando esperas infinitas
  3. Implementar mecanismos de tiempo de espera en tareas automatizadas
  4. 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.


Linux 命令大全Manual completo de comandos de Linux

Otras extensiones