Tabla de contenidos
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 timeout
comando. 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 timeout
comando le permite establecer un límite en el tiempo que 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 tener el timeout
control de 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.
timeout
es parte de GNU Core Utils, por lo que Linux y los sistemas operativos similares a 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 ping
comando se ejecutará hasta que lo detenga presionando Ctrl + C. Si no lo interrumpe, continuará.
ping 192.168.4.28
Al usarlo timeout
, podemos asegurarnos de ping
que no se ejecute de forma intermitente, consumiendo el ancho de banda de la red y molestando a cualquier dispositivo al que se le haga ping.
Este próximo comando se usa timeout
para limitar el tiempo ping
. Estamos permitiendo 15 segundos de tiempo de ejecución para ping
.
tiempo de espera 15 ping 192.168.4.28
Después de 15 segundos timeout
termina la 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 de 15. se timeout
supone 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:
tiempo de espera 3m ping 192.168.4.28
ping
se ejecutará durante tres minutos antes de timeout
que entre y detenga la ping
sesión.
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, estamos usando tcpdump
una herramienta de captura de tráfico de red . 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
Podemos ejecutar tcpdump
durante 10 segundos sus opciones predeterminadas y redirigir su salida a un archivo llamado capture.txt con el siguiente comando:
tiempo de espera 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 porque 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
todavía se están ejecutando, y capture.txt sigue creciendo en tamaño. Se necesitará un rápido Ctrl + C para detenerse tcpdump
.
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!
ls -lh capture.txt
¿Que pasó? ¿Por qué no se timeout
detuvo tcpdump
?
Todo tiene que ver con las señales.
Enviar la señal correcta
Cuando timeout
quiere detener un programa envía la señal SIGTERM . Esto pide cortésmente que el programa termine. Algunos programas pueden optar por ignorar la señal SIGTERM. Cuando eso suceda, debemos decir timeout
que debemos ser un poco más enérgicos.
Podemos hacer eso pidiendo timeout
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 -s
opción (señal) para decirle timeout
que envíe la señal SIGKILL.
tiempo de espera -s SIGKILL 10 sudo tcpdump> capture.txt
Este tiempo, tan pronto como hayan transcurrido 10 segundos, tcpdump
se detiene.
Preguntar educadamente primero
Podemos pedir timeout
que intentemos detener el programa usando SIGTERM, y solo enviar SIGKILL si SIGTERM no funcionó.
Para hacer esto, usamos la -k
opción (matar después). La -k
opción requiere un valor de tiempo como parámetro.
En este comando, pedimos timeout
que lo dejemos dmesg
correr durante 30 segundos y luego lo terminemos con la señal SIGTERM. Si dmesg
todavía está funcionando después de 40 segundos, significa que el diplomático SIGTERM 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.
tiempo de espera -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
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 timeout
está controlando.
Este comando se ping
ejecuta 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.
tiempo de espera 5 ping Nostromo.local
El comando se ejecuta durante cinco segundos y lo timeout
finaliza. Luego podemos verificar el código de salida usando este comando:
echo $?
El código de salida es 124. Este es el valor que se timeout
usa 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.
tiempo de espera 5 ping Nostromo.local
echo $?
Si la ejecución del programa termina antes de que lo timeout
termine, timeout
puede pasar el código de salida del programa al shell.
Para que esto suceda el programa debe llegar a su fin por sí misma (en otras palabras, es no terminado por timeout
), y hay que utilizar la --preserve-status
opción.
Si usamos la -c
opción (contar) con un valor de cinco ping
, solo dispararemos cinco solicitudes. Si le damos timeout
una duración de un minuto, ping
definitivamente habrá terminado por sí solo. Luego podemos verificar el valor de salida usando echo
.
tiempo de espera - preservar-estado 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 ping
, fuercemos ping
a generar un código de salida diferente. Si intentamos enviar solicitudes de ping a una dirección IP inexistente, 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 $?
El ping
comando obviamente no puede alcanzar 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 que se ping
utiliza para errores generales.
Establecer 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 timeout
y deje que su computadora se autorregule.