watch o vigilando comandos en Linux

Existen determinadas herramientas disponibles en Linux para realizar tareas de forma repetitiva. Herramientas como puede ser cron o los timer de Systemd. Sin embargo, en ocasiones, es posible, que no necesites, construir un arco de iglesia, para algo puntual, temporal, provisional, o simplemente muy sencillo. En esos casos, puedes utilizar watch, para ejecutar un comando repetitivamente.

Así, este artículo, está dedicado a watch. Una herramienta que te permite ejecutar un comando de forma repetitiva y a intervalos regulares, mostrando la salida en la propia consola. Y no solo en la consola, porque en este artículo, encontrarás como puedes redirigir la salida, utilizando otras herramientas.

watch o vigilando comandos

Watch o vigilando comandos

En principio el objetivo de watch es el de utilizarlo para vigilar o monitorizar el resultado de la ejecución de un determinado comando o, incluso, un script. Pero, al final, lo que te permite es repetir ese comando o script a intervalos regulares, y tu, con la salida puedes hacer lo que quieras.

Usos básicos

Supón, que has lanzado un proceso muy pesado, y quieres vigilar momentáneamente el consumo de memoria. Esto, lo puedes hacer fácilmente utilizando watch. Tan solo tienes que ejecutar la siguiente instrucción,

watch free

Esto te muestra algo como lo que puedes ver a continuación,

Cada 2,0s: free                                 xps13: Mon Oct 19 07:14:06 2020

              total       usado       libre  compartido búfer/caché  disponible
Memoria:     8055156     2483264     2264628     661412     3307264     4642048
Swap:       4243452      127744     4115708

Si no quieres que se muestre el título superior, tienes que añadir la opción, -t o --no-title. Es decir, watch -t free, y el resultado ahora será algo como lo que te muestro a continuación,

              total       usado       libre  compartido búfer/caché  disponible
Memoria:     8055156     2489392     2267788     650864     3297976     4646468
Swap:       4243452      127744     4115708

Opciones

Modificando el intervalo

Como ya te has dado cuenta, watch, ejecuta la instrucción que le has indicado a intervalos regulares de 2 segundos. Pero, ¿y si quieres que ese intervalo sea diferente a dos segundos?. De nuevo tienes una opción para ello. Simplemente tienes que utilizar la opción -n o --interval, de la siguiente forma,

watch -n 5 -t free

Si cambia te sales

Otra opción interesante que te ofrece watch es la posibilidad de que termine la ejecución en el caso de que se haya modificado la salida. En el ejemplo, que te he mostrado anteriormente, si el uso de memoria ha cambiado, respecto de la ejecución anterior, saldría, en otro caso, seguiría ejecutándose hasta que fuera diferente. Para esto tienes la opción -g o --chgexit. Por ejemplo,

watch -n 5 -t -g free

En el caso de free será muy extraño que se ejecute mas de una vez, por el simple hecho de que es muy raro que coincidan los mismos valores de uso de memoria.

Resaltando las diferencias

En el caso de que lo que se muestre por pantalla, sea muy similar entre una ejecución y otra, y además sea mucha información, te va a costar encontrar las diferencias. Sin embargo, watch también te ayudará en este caso, porque puedes hacer uso de la opción -d o --difference. Esta opción lo que hará será resaltar las diferencias entre una ejecución y otra.

Sin embargo, como ya te has dado cuenta, cada vez que se produce un cambio, el resaltado cambia. Este comportamiento lo puedes modificar para que cualquier cambio que se haya producido se vea resaltado, es decir, que el resaltado de cambios sea permanente o acumulativo. Para esto, tienes que utilizar la opción -d=cumulative.

Encadenando comandos

En el caso de que lo que vigilar, sea, no el resultado de un comando, sino el resultado de varios comandos encadenados con pipe, |, en este caso, obligatoriamente, deberás pasar toda la combinación de comandos entre comillas, ya sean simples o dobles.

Por ejemplo, si quieres monitorizar solo la memoria usada, puedes utilizar la siguiente instrucción,

watch -t 'free | grep -i memoria'

Guardando en un archivo

¿Y si lo que quieres es guardar los resultados también en un archivo? En este caso, tienes que recurrir a tee, y encadenar los comandos como has visto en el punto anterior, pero añadiendo al final este comando.

Así, para el ejemplo anterior, la instrucción a ejecutar, sería algo como lo que te muestro a continuación,

watch -t 'free | grep -i memoria | tee -a data.txt'

Donde data.txt es el archivo en el que se irán guardando los nuevos resultados conforme se vayan produciendo.

Ejecutándolo de esta forma tienes la ventaja de que verás los mismos resultados por pantalla, que los que se van guardando en el archivo.

Si, no te interesa ver los resultados por pantalla, sino que exclusivamente los quieres guardar en el archivo, entonces, la instrucción a ejecutar es la siguiente,

watch -t 'free | grep -i memoria >> data.txt'

Si quieres profundizar en >>, te recomiendo le des un vistazo al capítulo de redirigir entrada y salida del tutorial del terminal. En este mismo capítulo del tutorial, encontraras una referencia al encadenamiento de comandos, como lo que has visto anteriormente.

¿Y watch en segundo plano?

Y ¿como lo harías para dejarlo corriendo en segundo plano? Aunque este no es el objetivo principal de esta herramienta, es posible, que para un caso puntual, quieras utilizarlo de esta forma. En este caso, puedes ejecutarlo como te muestro en la siguiente instrucción,

watch -t 'free | grep -i memoria | tee -a data.txt' &>/dev/null &

Aún de esta manera, el problema con el que te puedes encontrar es que cuando cierres el terminal en el que has ejecutado esta instrucción, se detenga la ejecución de la misma. Para evitar este problema, puedes recurrir a herramientas como disown o nohup.

De cualquier forma, te recomiendo le des una lectura al artículo sobre procesos en segundo plano, que profundiza mas en este tema.

Conclusiones

Si bien, se trata de un comando realmente cómodo y práctico, lo veo, sinceramente, como una solución puntual y temporal. Para el caso de un uso mas prolongado, creo que lo suyo sería recurrir o bien a cron o los timer de Systemd, tal y como te he indicado en la introducción.


Más información,

Imagen de portada de mostafa meraji en Unsplash

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *