Cómo usar el comando timeout en Linux

Contenidos

Laptop Linux que muestra un indicador de bash

De acuerdo, ya es suficiente tiempo en la computadora. Puede dar a los procesos límites de tiempo, estableciendo un tiempo máximo que pueden ejecutarse con el timeoutmando. Aquí hay un tutorial para poner límites a la ejecución de programas con este comando.

¿Qué hace el tiempo de espera por usted?

los timeout el comando te posibilita establecer un límite en la cantidad de tiempo se ejecutará un programa. Pero, ¿por qué querrías hacer eso?

Un caso es cuando sabe exactamente cuánto tiempo desea que se ejecute un procedimiento. Un caso de uso común es tener timeout controle un programa de registro o captura de datos para que los archivos de registro no consuman implacablemente el espacio de su disco duro.

Otro caso es cuando no sabe cuánto tiempo desea que se ejecute un procedimiento, pero sí sabe que no desea que se ejecute indefinidamente. Es factible que tenga la costumbre de configurar los procesos en ejecución, minimizar la ventana de la terminal y olvidarse de ellos.

Algunos programas, inclusive utilidades simples, pueden generar tráfico de red a niveles que pueden impedir el rendimiento de su red. O pueden inmovilizar los recursos en un dispositivo de destino, lo que ralentiza su rendimiento. (ping, Te estoy mirando.) Dejar este tipo de programas ejecutándose durante períodos prolongados mientras no estás en tu computadora es una mala práctica.

timeout es parte del Utilidades principales de GNU por eso, los sistemas operativos Linux y tipo Unix, como macOS, disponen el tiempo de espera integrado. No hay nada que instalar; puede usarlo nada más sacarlo de la caja.

Comenzando con el tiempo de espera

He aquí un ejemplo sencillo. A modo de ejemplo, con sus opciones de línea de comandos predeterminadas, el ping El comando se ejecutará hasta que lo detenga presionando Ctrl + C. Si no lo interrumpe, continuará.

ping 192.168.4.28

A través de el uso timeout, podemos asegurarnos ping no se ejecuta de forma intermitente, masticando el ancho de banda de la red y molestando a cualquier dispositivo al que se le haga ping.

Este siguiente comando utiliza timeout al límite de tiempo ping. Permitimos 15 segundos de tiempo de ejecución para ping.

timeout 15 ping 192.168.4.28

Después de 15 segundos timeout termina el ping sesión y regresamos a la línea de comandos.

Uso del tiempo de espera con otras unidades de tiempo

Tenga en cuenta que no tuvimos que agregar una «s» detrás del 15. timeout asume que el valor está en segundos. Podría agregar una «s», pero verdaderamente no hace ninguna diferencia.

Para utilizar un valor de tiempo medido en minutos, horas o días, agregue una «m», una «h» o una «d».

Para que el ping se ejecute durante tres minutos, utilice el siguiente comando:

timeout 3m ping 192.168.4.28

ping funcionará durante tres minutos antes timeout interviene y detiene el ping sesión.

sesión de ping que se ejecuta en una terminal viuda

Limitar la captura de datos con tiempo de espera

Algunos archivos de captura de datos pueden crecer muy rápidamente. Para evitar que dichos archivos se vuelvan difíciles de manejar o inclusive de tamaño problemático, limite la cantidad de tiempo que se posibilita que el programa de captura se ejecute.

En este ejemplo, estamos usando tcpdump, a captura de tráfico de red herramienta. En las máquinas de prueba en las que se investigó este post, tcpdump ya estaba instalado en Ubuntu Linux y Fedora Linux. Había que instalarlo en Manjaro Linux y Arch Linux, con el siguiente comando:

sudo pacman -Syu tcpdump

Podemos correr tcpdump durante 10 segundos con sus opciones predeterminadas y redirigir su salida a un archivo llamado capture.txt con el siguiente comando:

timeout 10 sudo tcpdump > capture.txt

(tcpdump tiene sus propias opciones para guardar el tráfico de red capturado en un archivo. Este es un truco rápido debido a que estamos discutiendo timeout, no tcpdump.)

tcpdump comienza a capturar el tráfico de la red y esperamos 10 segundos. Y 10 segundos van y vienen y tcpdump aún se está ejecutando y capture.txt sigue creciendo en tamaño. Se necesitará un Ctrl + C apresurado para detener tcpdump.

Comprobando el tamaño de capture.txt con ls muestra que creció a 209K en cuestión de segundos. ¡Ese archivo estaba creciendo rápidamente!

ls -lh capture.txt

¿Qué sucedió? Por qué no timeout parada tcpdump?

Todo tiene que ver con las señales.

Enviar la señal correcta

Cuando timeout quiere detener un programa, envía el Señal SIGTERM. Esto le pide cortésmente al programa que termine. Algunos programas pueden decantarse por ignorar la señal SIGTERM. Cuando eso suceda, tenemos que decir timeout para ser un poco más contundente.

Podemos hacer eso preguntando timeout para enviar la señal SIGKILL en su lugar.

La señal SIGKILL no puede ser “capturada, bloqueada o ignorada”, siempre pasa. SIGKILL no pide cortésmente al programa que se detenga. SIGKILL se esconde a la vuelta de la esquina con un cronómetro y un cosh.

Podemos utilizar el -s (señal) opción para contar timeout para enviar la señal SIGKILL.

timeout -s SIGKILL 10 sudo tcpdump > capture.txt

Esta vez, tan pronto como hayan transcurrido 10 segundos, tcpdump está parado.

Preguntar educadamente primero

Podemos preguntar timeout para intentar detener el programa usando SIGTERM, y enviar solo SIGKILL si SIGTERM no funcionó.

Para hacer esto, usamos el -k (matar después) opción. los -k La opción necesita un valor de tiempo como parámetro.

En este comando, estamos preguntando timeout dejar dmesg funcionar durante 30 segundos y después terminarlo con la señal SIGTERM. Si dmesg sigue funcionando después de 40 segundos, significa que el SIGTERM diplomático fue ignorado y timeout debe enviar SIGKILL para terminar el trabajo.

dmesg es una utilidad que puede monitorear los mensajes del búfer de anillo del kernel y mostrarlos en una ventana de terminal.

timeout -k 40 30 dmseg -w

dmesg funciona durante 30 segundos y se detiene cuando recibe la señal SIGTERM.

Sabemos que no fue SIGKILL quien se detuvo dmesg debido a que SIGKILL siempre deja un obituario de una palabra en la ventana de la terminal: «Asesinado». Eso no sucedió en esta circunstancia.

Recuperar el código de salida del programa

Los programas que se comportan bien devuelven un valor al shell cuando terminan. Esto se conoce como código de salida. Por lo general, esto se utiliza para decirle al shell, o cualquier procedimiento que haya iniciado el programa, si el programa encontró problemas mientras se ejecutaba.

timeout proporciona su propio código de salida, pero es factible que eso no nos importe. Probablemente estemos más interesados ​​en el código de salida del procedimiento que timeout está controlando.

Este comando posibilita ping correr durante cinco segundos. Está haciendo ping a una computadora llamada Nostromo, que está en la red de prueba que se usó para investigar este post.

timeout 5 ping Nostromo.local

El comando se ejecuta durante cinco segundos y timeout lo termina. Después podemos verificar el código de salida usando este comando:

echo $?

El código de salida es 124. Este es el valor timeout utiliza para indicar que el programa se terminó usando SIGTERM. Si SIGKILL termina el programa, el código de salida es 137.

Si interrumpimos el programa con Ctrl + C el código de salida de timeout es cero.

timeout 5 ping Nostromo.local
echo $?

Si finaliza la ejecución del programa antes de timeout lo termina, timeout puede pasar el código de salida del programa al shell.

Para que esto suceda, el programa debe detenerse por sí solo (dicho de otra forma, es no terminado por timeout), y debemos utilizar el --preserve-status opción.

Si usamos el -c (recuento) opción con un valor de cinco ping solo disparará cinco solicitudes. Si damos timeout una extensión de un minuto, ping definitivamente habrá terminado por sí mismo. Después podemos verificar el valor de salida usando echo.

timeout --preserve-status 1m ping -c 5 Nostromo.local
echo $?

ping completa sus cinco solicitudes de ping y termina. El código de salida es cero.

Para verificar que el código de salida proviene de ping, vamos a forzar ping para generar un código de salida distinto. Si intentamos enviar solicitudes de ping a una dirección IP inexistente, ping fallará con un código de salida de error. Entonces podemos utilizar echo para chequear que el código de salida sea distinto de cero.

timeout --preserve-status 1m ping -c 5 NotHere.local
echo $?

los ping evidentemente, el comando no puede lograr el dispositivo inexistente, por lo que informa del error y se cierra. El código de salida es dos. Este es el código de salida ping usos para errores generales.

Determinar reglas básicas

timeout se trata de proporcionar algunos límites a los programas en ejecución. Si existe el peligro de que los archivos de registro invadan su disco duro o que olvide que dejó una herramienta de red en ejecución, envuélvalos en timeout y deje que su computadora se autorregule.

Suscribite a nuestro Newsletter

No te enviaremos correo SPAM. Lo odiamos tanto como tú.