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 :) 

cat: leer y crear archivos de texto de forma simple


$ whatis cat 
cat (1)              - concatenate files and print on the standard output

Cat, comando de usuario - concatená archivos e imprimilos en salida estándar (en texto, pues).


$ cat /etc/fstab 
muestra las unidades que son montadas automáticamente al arranque del sistema operativo.

$ cat archivo.txt
muestra el contenido del archivo de texto que has indicado. Ahora, recordá que en sistemas UNIX, un documento puede o no tener extensión. Un .png pudiera no terminar en ello, así como un .txt pudiera incluso terminar en .gif. Es el sistema quién escanea el archivo y determina su tipo de extensión. Puse el .txt para ejemplificar; y lo puse usando una ruta relativa: el directorio presente.  O sea, no importa dónde estés en el filesystem, vos podrás visualizar un archivo usando cat, siempre que incluyás la ruta correcta, relativa o absoluta, dependiendo del caso:

$ cat ../home/chepito/documentos/folder1/archivo20
y si ya estás en el folder1, sólo tendrías que hacer:

$ cat archivo20

Cat también puede servir para crear un archivo de texto nuevo, usando redirección de salida de corriente (output stream redirection). No vamos a hablar mucho de esto, sólo te digo que podés usar cat para crear un archivo nuevo de texto, así:

$ cat > archivo_de_texto_nuevo

y cat entrará en "modo interactivo"; en lugar del PS1 (el nombre de tu cursor en Terminal), vas a ver el " > " :

$ cat > archivo_de_texto
>

Y aquí podrás escribir texto, apretando enter para crear una nueva línea:

$ cat > archivo_de_texto
> primera línea para probar cat en modo interactivo
> segunda línea de prueba
> tercera línea, blah blah blah... 
> [ para finalizar, das enter, y luego "Ctrl D" ]

Y cuando hayás terminado, das enter una vez más, y en la línea en blanco apretás Ctrl + D. Esto sale del modo interactivo y guarda cambios. Ahora, mirá los cambios que lograste: 

$ cat  archivo_de_texto
 primera línea para probar cat en modo interactivo
 segunda línea de prueba
 tercera línea, blah blah blah... 
$

Digamos que querés agregar otra línea; entonces vas a usar

$ cat >> archivo_de_texto
> esta línea será agregada al final del documento.
> [ Ctrl D ] 

Uso Ctrl + D para salir y ahora:

$ cat  archivo_de_texto
 primera línea para probar cat en modo interactivo
 segunda línea de prueba
 tercera línea, blah blah blah... 
 esta línea será agregada al final del documento.
$

Recordá: 

$ cat > archivo
te permite crear y agregar líneas de texto a un archivo, sin tener que accesar a un editor. 

$ cat >> arhchivo 
añadirá nuevas líneas a un archivo ya existente, así haya sido creado por cat o por otro editor (gedit, leafpad, vim, nano...). Si por error hacés " " en lugar de " >> " a un archivo, vas a sobrescribir en lugar de agregar... o sea, vas a mandar a la mierda lo que había antes. Si necesitás editar una línea en particular, mejor usá un editor de GUI o de CLI (gedit, leafpad, nano, scratch editor, vim, emacs, etc.) para navegar hacia la línea deseada.

Resumen: 
¿Para qué me sirve cat? para mostrar el contenido de un archivo de texto en terminal, sin tener que usar herramientas externas, gráficas ni tener que salir de terminal. Esto significa: ahorro de recursos de procesamiento, y tu tiempo. Es usado a menudo para leer rápidamente archivos de configuraciones del filesystem, cuando son cortos. ¿Funciona con largos? Sí, pero no es tan cómodo a menos que tu Terminal tenga soporte de navegación vertical (para scrollear hacia arriba); o a menos que lo usés con una pipe y less; pero eso es otro asunto que no tocaré hoy y no tiene sentido. 

¿Tengo que usarlo? No. Pero existe y podrías beneficiarte de él; sin embargo, a veces podrás preferir un editor completo (así sea de CLI o GUI) como cuando estás leyendo scripts de programación, porque los editores dedicados tienen "resaltador de sintaxis", colorizan palabras claves, strings, booleanos, etc. 


Thursday, December 24, 2015

Extender tu partición / (root) sin herramientas gráficas; parte III.

Una vez me conecté, hice lo siguiente:

# df -h
Filesystem      Size  Used Avail Use% Mounted on
dev             3.7G     0  3.7G   0% /dev
run             3.7G  508K  3.7G   1% /run
/dev/sda1        15G  3.4G   11G  25% /
tmpfs           3.7G     0  3.7G   0% /dev/shm
tmpfs           3.7G     0  3.7G   0% /sys/fs/cgroup
tmpfs           3.7G     0  3.7G   0% /tmp
tmpfs           742M     0  742M   0% /run/user/0

Mi directorio root sigue mostrándose como de 11GB. Eso es porque df -h muestra el directorio donde está montada la partición, no la partición como tal. Por eso, volvemos a usar fdisk -l para mostrar las particiones:

# fdisk -l
Disk /dev/sda: 111.8 GiB, 120034123776 bytes, 234441648 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x000bcc1a

Device     Boot Start      End  Sectors Size Id Type
/dev/sda1        2048 62916607 62914560  30G 83 Linux

Cómo podés ver, los cambios sí tuvieron efecto en la partición, pero el tamaño del directorio (filesystem) sigue siendo de 15GB; hace falta redimensionar el filesystem. 

Como podés ver, mi unidad de almacenamiento mide 111.8 (un SSD de 110GB), y la partición ya reporta mis 30GB... pero mi filesystem de root (o sea, el sistema de directorio de root) sigue siendo de 15GB. Debo de extender el tamaño del filesystem; lo hago con esta herramienta: resize2fs.

NOTA: resize2fs redimensiona los filesystems en formato ext2, ext3, ext4. Puede encoger o extender el filesystem si se accede desde fuera del sistema operativo (como una imagen en vivo, por ejemplo, o si tenés el disco duro conectado como "slave" o secundario/adicional en otro equipo); pero si estás corriendo desde el sistema operativo, sólo vas a poder extender el filesystem en cuestión, no encogerlo. A esto se le llama "online resizing", entre otras. Encontré resize2fs en Elementary y Arch; no tuve que instalar nada adicional para usarle.

Vamos entonces a hacer la expansión del filesystem de root, en la partición correspondiente (df -h te dice cuál es la partición correspondiente, recordalo); en mi caso:

# resize2fs /dev/sda1
resize2fs 1.42.13 (17-May-2015)
Filesystem at /dev/sda1 is mounted on /; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 2
The filesystem on /dev/sda1 is now 7864320 (4k) blocks long. (mensaje de la felicidad :D )

Y confirmo cambios en el tamaño del directorio:

# df -h
Filesystem      Size  Used Avail Use% Mounted on
dev             3.7G     0  3.7G   0% /dev
run             3.7G  508K  3.7G   1% /run
/dev/sda1        30G  3.4G   25G  12% /
tmpfs           3.7G     0  3.7G   0% /dev/shm
tmpfs           3.7G     0  3.7G   0% /sys/fs/cgroup
tmpfs           3.7G     0  3.7G   0% /tmp
tmpfs           742M     0  742M   0% /run/user/0



¡LISTO! ya tenés más espacio en el directorio y partición de root :D :D :D  Ya podés seguir descargando porno y tonterías en tu partición. 

Extender tu partición / (root) sin herramientas gráficas; parte II.

Entonces, ya determinaste cuánto espacio más podés/querés adicionar a tu partición de root. Ahora hay que agregarlo. 

¿Cómo lo hago? fácil; para agregar más espacio a la partición de root, borrás la partición de root. ¿Ah? La borrás y luego la recreás con el nuevo espacio total. Si comenzaba en 7GB y querés que sea de 25GB entonces la recreás con 25GB en total. 

¿Estás seguro? ¿no me voy a cagar en todo? Sí, estoy seguro; y no, no te vas a cagar en todo; todo va a estar bien SI y sólo SI el primer sector de la nueva partición coincide con el primer sector de la nueva partición
Ahora, asumo  que vos sos un ser humano responsable y que sabés cómo usar el papel higiénico de forma apropiada y de la misma forma sabés cómo respaldar tus datos... pero como no lo sé con certeza y no me interesa, dejo este disclaimer amigable: yo no soy responsable de cualquier cagada que le hagás a tu equipo. Respaldá tu info primero.

Procedemos: 

# fdisk /dev/sda

Welcome to fdisk (util-linux 2.27.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): d (esto borra la partición)
Selected partition 1
Partition 1 has been deleted.

Command (m for help): n (hacemos la nueva partición)
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p (por supuesto que primaria)
Partition number (1-4, default 1): (la tecla "enter" acepta el valor default)
First sector (2048-234441647, default 2048):  (la tecla "enter" acepta el valor default)
Last sector, +sectors or +size{K,M,G,T,P} (2048-234441647, default 234441647): +30G (el nuevo espacio que quiero; el tuyo puede ser distinto. Si lo querés en megas, usá M y la cantidad apropiada; probablemente tendrás que usar unidades/decenas/centenas de millares)

Created a new partition 1 of type 'Linux' and of size 30 GiB.

Command (m for help): w (escribe y guarda cambios)
The partition table has been altered.
Calling ioctl() to re-read partition table.
Re-reading the partition table failed.: Device or resource busy
(no te asustés, el de arriba es una advertencia lógica y normal)
The kernel still uses the old table. The new table will be used at the next reboot or after you run partprobe(8) or kpartx(8).

# reboot 0 
(es un número cero, significa: reiniciá ya, saltate la cuenta del minuto y medio)
Esto fue lo que hice hace un par de horas. 
Podría explicarte cada línea, pero es extendernos y además, estoy seguro que si te interesa, vas a traducirlas por tu cuenta o usar un traductor. Ya en la otra parte explico cómo concluir esto. 

Extender tu partición / (root) sin herramientas gráficas; parte I.


PARA ENTENDER este artículo, te sugerimos aprender los conceptos de filesystem, directorio, particiones y documentación adicional sobre fdisk.

Si te atreviste a configurar manualmente tus particiones cuando instalaste tu distro, probablemente te preguntaste ¿cuánto espacio necesito para mi partición root? ¿cuántas particiones necesito? ¿cuánto espacio asigno  a una partición swap? 

Todas estas preguntas ya tienen respuesta en las wikis y documentos oficiales de cada distro. Para usuarios expertos, determinar cuánto espacio debe de ser asignado a qué, es fácil. Para los n00bs totales, también porque dejan que los instaladores lo hagan todo por ellos. 

Pero para los que estamos aprendiendo en el ruedo, puede que esas respuestas no nos ayuden totalmente y necesitemos un poco de flexibilidad; tal vez por error o por desconocimiento, asignamos manualmente espacio suficiente para instalar el sistema base y conforme instalamos más paquetes, vemos que nos quedamos sin espacio adicional en la partición, aun teniendo espacio extra en nuestro disco. Si ese sos vos, te explicamos cómo agrandar/estirar/alargar tu partición root vía Terminal, mientras tu sistema operativo está corriendo. A esto se le conoce como LIVE/ONLINE ROOT PARTITION RESIZING o "redimensionamiento de la partición root en vivo/en línea".

PREGUNTA IMPORTANTE ¿por qué habría de usar este método cuando existe Gparted o cuando puedo usar una imagen en vivo desde  un CD/USB? Porque tal vez estás aprendiendo de admiministración de sistemas o corriendo un servidor como en mi caso, o tal vez ya sos un administrador y tenés un servidor de producción al que forzosamente necesitás extenderle el root; o puede que no dispongás de otro sistema o imagen, o simplemente porque sos jarcor (hardcore) y querés aprender a hacerlo sin usar interfaces gráficas (GUIs). Si este es tu caso, seguí leyendo. De otra forma, buscá en línea cómo  usar Gparted, que es más fácil y apropiado para usuarios que no se sienten cómodos trabajando en Terminal porque no tienen el conocimiento y/o no desean aprender a usarla.


RECOMENDACIÓN ANTES DE CORRER UN COMANDO

Usá

$ whatis nombre_del_comando
$ man nombre_del_comando
$ nombre_del_comando --help
$ nombre_del_comando -h

por seguridad y para conocer un poco de ese comando antes de ejecutarlo.

De nada. Felices fiestas :D

Nuevo equipo, jugando con microservidores.

Ratos de no escribirles.

He llegado a la conclusión de que este blog difícilmente tendrá un desarrollo "lineal". Inicialmente decidí que sería una especie de manual introductorio para novatos GNU/Linux. Durante el tiempo que no escribo, aprendo de administración Linux, programación, microcontroladores y demás; esas cosas no considero necesarias para un novato; pero compartiré las cosas que considere útiles. Algunas de ellas pueden ser de nivel básico y otras requieren un conocimiento mayor en esto o aquello. 

Esta actualización podría ser un poco "avanzada" puesto que habla de hardware y un poco de soluciones de almacenaje.

Me hice de nuevo equipo y me deshice de mi Phenom 960T. Ahora, tengo una laptop intel (i5 4210u, 8GB, Nvidia 840M, 720p, WiFi, Bluetooth, parlantes, teclado y 1TB que reemplacé por mi SSD de 128GB) en la cual tengo Freya. Ya tengo unos tres meses en ella y no me quejo de nada :) ¿Por qué tanta RAM y un i5? porque serán útiles durante mi aprendizaje de FOSS. 

Desde hace un par de años vengo con la idea de construir mi propio servidor multipropósito y alojarlo en casa. Existe un invento llamado "la nube", y otro llamado "servidor NAS" pero para todo el material que tengo (software, imágenes, música, etc.) y como prefiero armar mis propios equipos y aprender del FOSS, quise hacer mi propio servidor. 

Ya tenía mi PC de escritorio y se me ocurrió que tenía el suficiente músculo para hacerla un servidor (Phenom 960T quad core, convertible en hexacore; 2GB Nvidia GTX 650 Ti Boost de EVGA, Asrock 990FX Extreme3; 8GB de RAM Kingston Hyper X Beast; OCZ SSD de 128GB SATA III; 2x 3TB Western Digital Caviar Red SATA III; radiador Corsair H60; Cooler Master CM 690 II; -lector de tarjetas y sin unidad óptica interna :v ); pero honestamente, casi no le usaba y sería un consumo de energía excesivo para lo que quiero.

Me di la tarea de buscar desde hace unos años y encontré la solución perfecta: motherboards embebidas (SoC, Single Chip computers); son simplemente motherboards de factor pequeño (usualmente micro ATX, baby ATX, mini ITX o incluso Pico ITX) con procesadores de bajo consumo (usualmente, procesadores de laptop); que toman RAM de escritorio o laptop y tienen varios puertos SATA. Son populares en países de Asia y el primer mundo occidental, para entusiastas que deciden hacer sus propios Home Theater PCs (HTPCs) o micro servidores e incluso como PCs domésticas para quines no tienen exigencias altas (gaming, creación multimedia, compilar código,  virtualización, etc.).

Durante los tres-cuatro años que contemplé la idea, llamaron mi atención una motherboard Zotac con un AMD Turion de doble núcleo (ya bastante viejo, pero de bajo consumo), una AsRock con un AMD Zacate E-350, y una Asrock con el AMD Kabini A4-5000. Todos procesadores originalmente pensados para laptops. También varios Intel (los Intel Celeron Bay Trail son muy buenos, pero valen un poquito más y tienen menos puertos SATA III: aquí estamos considerando algo llamado escalabilidad).

El Kabini me pareció perfecto para el trabajo puesto que trae cuatro puertos SATA III (lo que me permitiría poner dos o más discos en RAID 1), aparte de tener un TDP de W, y ser quad core... de apenas a 1.5GHz, pero es suficiente para lo que hará: proveer almacenaje en mi red local y tal vez alojar sitios en WordPress para cuando retome el tema; en todo caso, tengo dos núcleos extra en comparación al E-350.  podría beneficiarme de los múltiples núcleos

Mientras tanto, aprendí a instalar Arch vía VirtualBox en mi laptop (virtualizar requiere bastante RAM según los SOs que se corren). No considero hacer una guía al respecto porque ya existe: está en la Wiki de Arch, y siguiendo su filosofía me adhiero al principio #KISS (keep it simple, stupid!) y por eso es que te sugiero: #RTFM (read the fucking manual!). 

Hace unos dos meses, me llegó la mini ITX; conecté mi otro  SSD a la mobo Kabini e instalé Arch hace unos cuantos sábados. Como está pensada para servidor, no requiero de un Entorno de Escritorio; aun así, instalé Awesome WM como lo hice en el Arch de VirtualBox. Tal vez hable de Awesome en otra entrada después. En mi tiempo libre me di a la tarea de auditar mis discos duros y consolidar todos mis archivos en mi disco duro externo. Ya luego configuro RAID 1, un par de daemons y copio la info de mi disco duro externo a ellos. 

Leyendo de administradores y desarrolladores angloparlantes, aprendí ciertos trucos a implementar en mi servidor, pero... la cagué al configurar la instalación;

... apenas y le asigné 15GB de espacio a la partición root. El sistema base de Arch pesa menos de 3.5GB ( # df -h muestra 3.4GB usados hasta ahora, que tiene paquetes extra que he instalado), pero preveo que podré necesitar más espacio en un futuro cercano. 

Así que en la próxima entrada, te compartiré cómo hice para extender la partición root.

Y eso. Felices fiestas :) 

Entradas populares.