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
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
La entrada watch o vigilando comandos en Linux aparece primero en El atareao.