Cómo usar el comando timeout en Linux

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

¿Qué le aporta el tiempo de espera?

El comando de tiempo de espera le permite establecer un límite en el 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 proceso. Un caso de uso común es hacer que el tiempo de espera 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 proceso, pero sí sabe que no desea que se ejecute indefinidamente. Es posible que tenga el hábito de configurar procesos en ejecución, minimizar la ventana de terminal y olvidarse de ellos.

Algunos programas, incluso 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.

el tiempo de espera es parte del Utilidades principales de GNU por lo que los sistemas operativos Linux y tipo Unix, como macOS, tienen 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. Por ejemplo, con sus opciones de línea de comandos predeterminadas, el comando ping se ejecutará hasta que lo detenga presionando Ctrl + C. Si no lo interrumpe, continuará.

ping 192.168.4.28

ping 192.168.4.28 en una ventana de terminal

Al usar el tiempo de espera, podemos asegurarnos de que el ping no se ejecute de manera intermitente, consumiendo el ancho de banda de la red y molestando a cualquier dispositivo al que se esté haciendo ping.

  Cómo configurar Mattermost en Linux

Este siguiente comando usa el tiempo de espera para limitar el tiempo de ping. Estamos permitiendo 15 segundos de tiempo de ejecución para ping.

timeout 15 ping 192.168.4.28

tiempo de espera 15 ping 192.168.4.28 en una ventana de terminal

Después de 15 segundos, el tiempo de espera finaliza la sesión de ping y regresamos a la línea de comandos.

sesión de ping terminada en una ventana de terminal

Uso del tiempo de espera con otras unidades de tiempo

Tenga en cuenta que no tuvimos que agregar una «s» detrás del 15. El tiempo de espera asume que el valor está en segundos. Puede agregar una «s», pero realmente no hace ninguna diferencia.

Para usar 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

tiempo de espera 3m ping 192.168.4.28 en una ventana de terminal

ping se ejecutará durante tres minutos antes de que se agote el tiempo de espera y detenga la sesión de ping.

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 incluso de tamaño problemático, limite la cantidad de tiempo que el programa de captura puede ejecutarse.

En este ejemplo, usamos tcpdump, un captura de tráfico de red herramienta. En las máquinas de prueba en las que se investigó este artículo, 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

sudo pacman -Syu tcpdump en una ventana de terminal

Podemos ejecutar 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

timeout 10 sudo tcpdump> capture.txt en una ventana de terminal ”width =” 646 ″ height = ”77 ″ onload =” pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this); ”  onerror = ”this.onerror = null; pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this);”> </p>
<p> (tcpdump tiene sus propias opciones para guardar el tráfico de red capturado en un archivo. Este es un truco rápido porque nosotros ‘ estamos discutiendo el tiempo de espera, no tcpdump.) </p>
<p> tcpdump comienza a capturar el tráfico de red y esperamos 10 segundos.  Y 10 segundos van y vienen y tcpdump todavía se está ejecutando, y capture.txt sigue creciendo en tamaño.  Se necesitará presionar Ctrl + C para detener tcpdump. </p>
<p> Verificar el tamaño de capture.txt con ls muestra que creció a 209K en cuestión de segundos.  ¡Ese archivo estaba creciendo rápidamente! </p>
<pre> ls -lh capture.txt </pre>
<p> <img loading =

¿Que pasó? ¿Por qué el tiempo de espera no detuvo 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 pide cortésmente que el programa termine. Algunos programas pueden optar por ignorar la señal SIGTERM. Cuando eso suceda, necesitamos decirle al tiempo de espera para ser un poco más contundente.

  Las 5 mejores distribuciones de Linux para juegos

Podemos hacer eso pidiendo tiempo de espera para enviar la señal SIGKILL en su lugar.

La señal SIGKILL no puede ser “capturada, bloqueada o ignorada”, siempre se transmite. 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 usar la opción -s (señal) para indicar el tiempo de espera para enviar la señal SIGKILL.

timeout -s SIGKILL 10 sudo tcpdump > capture.txt

tiempo de espera -s SIGKILL 10 sudo tcpdump> capture.txt en una ventana de terminal ”ancho =” 646 ″ altura = ”167 ″ onload =” pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (esto); ”  onerror = ”this.onerror = null; pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this);”> </p>
<p> Esta vez, tan pronto como hayan transcurrido 10 segundos, tcpdump se detiene. </p>
<p> < img cargando =

Preguntar educadamente primero

Podemos pedir tiempo de espera para intentar detener el programa usando SIGTERM, y solo enviar SIGKILL si SIGTERM no funcionó.

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

En este comando, pedimos un tiempo de espera para dejar que dmesg se ejecute durante 30 segundos y luego terminarlo con la señal SIGTERM. Si dmesg todavía se está ejecutando después de 40 segundos, significa que se ignoró el SIGTERM diplomático y el tiempo de espera debe enviar SIGKILL para finalizar 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

timeout -k 40 30 dmseg -w en una ventana de terminal

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

Salida de dmesg en una ventana de terminal

Sabemos que no fue SIGKILL el que detuvo a dmesg porque SIGKILL siempre deja un obituario de una palabra en la ventana de la terminal: «Asesinado». Eso no sucedió en este caso.

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. Normalmente, esto se utiliza para decirle al shell, o cualquier proceso que haya iniciado el programa, si el programa encontró problemas mientras se ejecutaba.

timeout proporciona su propio código de salida, pero es posible que eso no nos importe. Probablemente estemos más interesados ​​en el código de salida del proceso que controla el tiempo de espera.

  Cómo cifrar archivos con gocryptfs en Linux

Este comando permite que el ping se ejecute durante cinco segundos. Está haciendo ping a una computadora llamada Nostromo, que está en la red de prueba que se usó para investigar este artículo.

timeout 5 ping Nostromo.local

timeout 5 ping Nostromo.local en una ventana de terminal

El comando se ejecuta durante cinco segundos y el tiempo de espera lo termina. Luego podemos verificar el código de salida usando este comando:

echo $?

salida de ping y echo $?  en una ventana de terminal

El código de salida es 124. Este es el valor que usa el tiempo de espera 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 del tiempo de espera es cero.

timeout 5 ping Nostromo.local
echo $?

timeout 5 ping Nostromo.local en una ventana de terminal usando Ctrl + C

Si la ejecución del programa finaliza antes de que termine el tiempo de espera, el tiempo de espera puede devolver el código de salida del programa al shell.

Para que esto suceda, el programa debe detenerse por sí solo (en otras palabras, no se termina con el tiempo de espera), y debemos usar la opción –preserve-status.

Si usamos la opción -c (cuenta) con un valor de cinco, el ping solo disparará cinco solicitudes. Si le damos al tiempo de espera una duración de un minuto, el ping definitivamente habrá terminado por sí solo. Luego podemos verificar el valor de salida usando echo.

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

timeout --preserve-status 1m ping -c 5 Nostromo.local en una ventana de terminal

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, fuercemos a ping para generar un código de salida diferente. Si intentamos enviar solicitudes de ping a una dirección IP inexistente, el ping fallará con un código de salida de error. Luego podemos usar echo para verificar que el código de salida no sea cero.

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

timeout --preserve-status 1m ping -c 5 NotHere.local en una ventana de terminal

El comando ping obviamente no puede llegar al 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 que usa ping para errores generales.

Establecer reglas básicas

El tiempo de espera 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, encárguelos en el tiempo de espera y deje que su computadora se autorregule.