Sunday, December 27, 2015

Comando watch: ejecución de programas periódicamente

NOTA: Como lo mencionaba antes, los artículos que compartiré de ahora en adelante pueden o no ser adecuados para novatos; porque requieren un poco más de esfuerzo y conocimiento para previo para entenderlos. Este artículo habla de  dos cosas: primero, el uso de un comando nuevo y muy útil, pero cuyo potencial no se aprovecha si no hablamos de lo segundo: las pipelines o tuberías. No vamos a profundizar en el segundo aspecto porque, aunque no es extenso, requiere especial atención y dedicación; le veremos de grosso modo para entender la flexibilidad de los sistemas operativos Unix. Si estás interesado en las pipelines, te sugerimos investigar en línea mientras publicamos algo dedicado a ellas. 

Según 

$ whatis watch
watch (1)            - execute a program periodically, showing output fullscreen

Traduciendo: 

watch (1: comando de usuario) - ejecutá un programa periódicamente, mostrando el resultado en pantalla completa (o sea, abarca toda la Terminal).

Watch es un programa que ejecuta programas. ¿Por qué "watch" ("observar", "mirar")? ni idea; no lo he buscado, pero sospecharía que tiene que ver con su propósito: mostrar el resultado (el output) en la Terminal. Esto nos puede ayudar cuando queremos observar cambios en un documento o un proceso.

Por ejemplo,

Me estoy descargando un archivo de internet. Digamos que cerré la interfaz de la aplicación pero ella sigue corriendo en el background y no quiero volver a abrirla ―por pereza o porque no quiero que su GUI me gaste RAM que puedo dedicar a otra cosa― pero quiero saber cómo va la descarga. Entonces, recuerdo que antes hablábamos del comando ls, útil para LISTAR directorios y archivos en el filesystem. 
ls -s muestra el tamaño de los archivos (en Bytes, pero esto puede ser modificado según se necesite: $ ls --block-size=1M)
Entonces, si watch me permite ejecutar un programa cada cierto tiempo, puedo hacer que watch monitoree el tamaño del archivo, reportado por ls -s, conforme crece):

$ watch -n4 ls -s downloads/archivo_siendo_descargado_por_otro_programa
Te recuerdo que podés hacer esto para un archivo localizado en cualquier directorio si sabés la ruta absoluta o relativa a usar. Y esto te reportará un output así:

Instalamos FreeBSD hace un par de años y pensamos hacerlo de nuevo; esta vez con un poquito más de conocimiento para apreciarle y usarle mejor :)

Otro ejemplo:

(un poco más complejo) El otro día quería ver -por curiosidad- los cambios en tiempo real de la velocidad de mi CPU (cuando digo CPU, me refiero al microchip, al procesador, no al cajón de desktop; este es un término mal usado y debemos de dejar de hacerlo). Un colega en un grupo de Linux en FB decía que Ubuntu mantenía a sus procesador al máximo y por eso calentaba su laptop... pero recuerdo que una vez ya había medido la velocidad de mi CPU en tiempo real con watch dentro de Freya cuando tenía mi Phenom 960T; revisé los documentos de nuevo y para salir de la duda, lo hice en mi laptop nueva. 

La info del procesador se puede obtener de muchas formas según encontré en sitios diversos; pero me voy a enfocar en una manera simple. Primero, te voy a recordar el uso del comando cat.

$ cat /proc/cpuinfo  
muestra información relacionada a tu procesador: 

Según el número de núcleos detectados por tu sistema, esta muestra aparecerá una o más veces con diferente # en el primer campo (processor); en el caso de un Intel móvil, aparece cuatro veces, enumerados del 0 al 3 (este i5 es dual core, pero Intel hace uso de su Hyper Threading, duplicando el número de hilos como si fueran el doble de núcleos).
Y esto es útil, pero hay dos cosas:

• Sólo me muestra la velocidad base (donde está el modelo del cpu) y la velocidad en MHz al momento de ejecutar este comando (2670.281 MHz, o sea, 2.67GHz)
• Me llena la Terminal de información totalmente inútil/que no me importa de momento. Sólo quiero saber los cambios de velocidad en tiempo real o intervalos, no todas las tech specs del cpu.

Aquí es donde watch es útil:

Aplicando Pipelines:


Para mostrarte lo que quiero decir, usaremos adicionalmente el comando (que no vamos a ver con detalle, porque su uso es extenso y flexible) grep, que sirve para buscar patrones específicos de texto en un documento/archivo. 

vamos primero a usar una pipeline para unir a ambos comandos: 

cat | grep 

Esto se leería algo así: 

mostrar info (para el caso, del procesador); y usar una tubería (el " | " es una "pipe" o tubería) para que el resultado de cat, sea procesado por grep, quien se encargará de filtrar la info innecesaria y sólo de mostrar la sección específica que queremos. Las pipelines toman el resultado (output) de un comando y lo usan como info de entrada (input) de otro comando para que este haga una tarea con ella y la procese de forma que dé, otro resultado (otro output).

Vamos entonces con cualquiera de estos: 

$ cat /proc/cpuinfo | grep MHz
$ cat /proc/cpuinfo | grep -i mhz

Ambos van a lo mismo,  la opción " -i " dice a grep que sea indiferente a la capitalzación (en buen salvadoreño: que le valga verga si  hay mayúsculas o no, que igual muestre resultados si los encuentra). Entonces esto nos arroja lo siguiente:



Hasta ahí todo bien. PEEEEEEROOOOOooooOOOOooo... muestrala velocidad grabada al momento de ejecución; no en tiempo real. Aquí hacemos uso de watch: 

$ watch -n2 " cat /proc/cpuinfo | grep -i mhz "

Y este es el resultado: 


"Every 2.0s:" ... con -n2 establecí que watch ejecute cat | grep cada dos segundos. Y los cambios son reportados puntuales: 

-

Y listo.

En resumen: 

• watch nos sirve para ejecutar otros comandos (o sea, otros programas) a intervalos definidos por el usuario/administrador. Así podemos monitorear en tiempo real, procesos y tareas que estamos ejecutando.
• las pipelines ( cuando veás este símbolo en un comando o combinación de ellos " | ", seguramente estás frente a una pipeline) nos sirven para ejecturar comandos consecutivamente, y que el resultado de uno, sea manipulado y procesado por otro.

Ambos ejemplos son relativamente rústicos para las herramientas con las que contamos actualmente; el propósito de estos artículos es 1) familiarizarte con tu Terminal y la CLI, 2) prescindir de bloatware (software innecesario) que desperdicie espacio en tu disco, y de GUIs que utilizan recursos extra para llegar a lo mismo, 3) mostrarte la flexibilidad y potencial de las herramientas de Terminal, valoradas especialmente por SysAdmins veteranos y expertos del FOSS. 

Espero que te haya gustado y sido útil esta nota. Compartila, comentá y avisanos si te gustaría que hablemos de otros temas en particular. Saludos :) 

No comments:

Entradas populares.