Introducción
timeout
es una utilidad de línea de comandos que ejecuta un comando específico y lo termina si aún se está ejecutando después de un período de tiempo específico. En otras palabras, permite un timeout
de espera para ejecutar un comando con un límite de tiempo. El timeout
es parte del paquete de utilidades principales de GNU que se instala en casi todas las distribuciones de Linux.
Esto es útil cuando desea ejecutar un comando que no tiene una opción de tiempo de espera incorporada.
En este artículo, explicaremos cómo usar el timeout
Cómo utilizar el comando de tiempo de espera
La sintaxis del timeout
es la siguiente:
timeout [OPTIONS] DURATION COMMAND [ARG]…
El DURATION
puede ser un número entero positivo o un número de punto flotante, seguido de un sufijo de unidad opcional:
s
- segundos (predeterminado)m
- minutosh
- horasd
- días
Cuando no se utilizan unidades, el valor predeterminado es segundos. Si la duración se establece en cero, el tiempo de espera asociado se desactiva.
Las opciones de comando deben proporcionarse antes de los argumentos.
A continuación, se muestran algunos ejemplos básicos que demuestran cómo utilizar el comando timeout
Finalizar un comando después de 5 segundos:
timeout 5 ping 8.8.8.8
Finalizar un comando después de 5 minutos:
timeout 5m ping 8.8.8.8
Finalizar un comando después de 1 y 6 segundos:
timeout 1.6m ping 8.8.8.8
Si desea ejecutar un comando que requiere privilegios elevados como tcpdump
, anteponga el sudo
antes del timeout
:
sudo timeout 300 tcpdump -n -w data.pcap
Envía una señal específica
Si no se da ninguna señal, el timeout
envía la SIGTERM
al comando administrado cuando se alcanza el límite de tiempo. Puede especificar qué señal enviar usando la -s
( --signal
).
Por ejemplo, para enviar SIGKILL
al ping
después de 1 minuto, usaría:
sudo timeout -s SIGKILL ping 8.8.8.8
La señal se puede especificar con el nombre SIGKILL
o con su número correspondiente 9
. El siguiente comando es idéntico al anterior:
sudo timeout -s 9 ping 8.8.8.8
Para obtener una lista de todas las señales disponibles, use el comando kill -l
kill -l
Matar (matar) procesos bloqueados
SIGTERM
, la señal predeterminada que se envía cuando se excede el límite de tiempo, puede ser detectada o ignorada por algunos procesos. En tales situaciones, el proceso continúa ejecutándose después de enviar la señal de terminación.
Para asegurarse de que se cancele el comando monitoreado, use la -k
( --kill-after
) después de un período de tiempo. Cuando se usa esta opción después de que se alcanza el límite de tiempo especificado, el comando de timeout
SIGKILL
al programa administrado que no se puede capturar ni ignorar.
En el siguiente ejemplo, el timeout
ejecuta el comando para un 1 y, si no se termina, lo matará después de 10 segundos:
sudo timeout -k 10 1m ping 8.8.8.8
Conservación del estado de salida
timeout
devuelve 124
cuando se alcanza el límite de tiempo. De lo contrario, devuelve el estado de salida del comando administrado.
Para devolver el estado de salida del comando incluso cuando se alcanza el límite de tiempo, use la opción --preserve-status
timeout --preserve-status 5 ping 8.8.8.8
Corriendo en primer plano (primer plano)
De forma predeterminada, el timeout
ejecuta el comando administrado en segundo plano. Si desea ejecutar el comando en primer plano, use la opción --foreground
timeout --foreground 5m./script.sh
Esta opción es útil cuando desea ejecutar un comando interactivo que requiere la entrada del usuario.
Conclusión
El timeout
se usa para ejecutar un comando determinado con un límite de tiempo.
timeout
es un comando simple que no tiene muchas opciones. Por lo general, invocará el timeout
con solo dos argumentos, la duración y el comando manejado.