Script de Linux para controlar el uso de memoria

Una entrada rápida: Un script de linux para controlar el uso de memoria en Linux, que además envía un email a la cuenta que le digamos.

#!/bin/bash
while [ true ] ;do
used=`free -m |awk 'NR==3 {print $4}'`
 
if [ $used -lt 900 ] && [ $used -gt 700 ]; then
echo "Uso elevado de memoria, hay menos de 900 megas libres." | /bin/mail -s "USO ELEVADO DE MEMORIA" micuenta@midominio.com
 
 
fi
sleep 5
done

Hacer que un fichero en Linux no pueda ser borrado ni modificado.

A veces nos interesa que en nuestro sistema Linux haya algún fichero inmutable, que no pueda ser borrado o modificado incluso aunque se intente con permisos de superusuario. ¿Es posible? Sí, con el comando chattr y usando la opción +i. Por ejemplo:

chattr +i nombre_del_fichero

Si lo aplicamos a una carpeta esto haría no solo que la carpeta no pueda ser borrado o editada sino que tampoco se puedan añadir nuevos ficheros a la misma o borrarlos, pero sí se podrían editar estos ficheros. ¿Se puede hacer que estos tampoco puedan ser editados? Sí, habría que aplicar el comando de forma recursiva sobre la carpeta para que afecte a todo lo que esta contiene:

chattr +i -RV nombre_de_carpeta

¿Y para quitar este flag y poder borrarlo o editarlo? En lugar de +i se usa -i:

chattr -i nombre_del_fichero

¿Esto tiene alguna utilidad? Pues sí. Por ejemplo podéis hacer que el fichero de usuarios o de contraseñas del sistema sea inmutable, de forma que nadie podría darse de alta sin antes modificar los permisos del fichero para ello, dando un punto extra a la seguridad.

Seguir partidos de la NBA desde un terminal de Linux

Mis amigos saben que me encanta el baloncesto, Linux y las cosas altamente freaks. Y esta mañana, cuando me levanté, me encontré con que uno me había compartido en el muro de Facebook esta entradade OMGUbuntu: Ver partidos de la NBA desde el terminal con NBA-Go.

¿Cómo va esto?

Bueno, lo primero es tener npm instalado instalado en vuestro equipo. Está en los repositorios de Ubuntu:

sudo apt-get update
sudo apt-get install nodejs
sudo apt-get install npm

Y una vez tengamos npm instalado vamos a instalar NBA-Go:

sudo npm install -g nba-go

El programa principalmente ofrece dos comandos: game y player (abreviados g y p). Dentro de la opción game hay dos opciones posibles: ver qué partidos hay disponibles y ver uno en concreto.

A la hora de ver los posibles tenemos las opciones date, yesterday, today y tomorrow. La primera para una fecha concreta, la segunda para los partidos de ayer, la tercera para los de hoy y la cuarta para los de mañana. Vemos ejemplos:

//fecha formato año/mes/día
$ nba-go game -d 2017/11/02
$ nba-go game --date 2017/11/02
//ayer
$ nba-go game -y
$ nba-go game --yesterday
//hoy
$ nba-go game -t
$ nba-go game --today
//mañana
$ nba-go game -T
$ nba-go game --tomorrow

Una vez listado podéis navegar con el partido, ver la información previa al juego o seguir el desarrollo del mismo con las estadísticas en directo. También podéis ver el boxscore del partido ya finalizado con toda la estadística.

Aquí os dejo un gif de la página oficial que ilustra esto:

Seleccionar partido

Partido en directo

Con el comando player tenemos tres opciones: información general, estadísticas de la temporada regular o de los playoff. Voy a usar el mismo ejemplo que en la página oficial para que cuadre con el gif que voy a usar de la misma.

//info de Curry
$ nba-go player Curry -i
$ nba-go player Curry --info
//temporada regular
$ nba-go player Curry -r
$ nba-go player Curry --regular
//eliminatorias
$ nba-go player Curry -p
$ nba-go player Curry --playoffs
//todo junto
$ nba-go player Curry -i -r -p

Información de jugadores

Os dejo por aquí el enlace al proyecto en GitHub por si queréis ver el código o si queréis clonarlo.

Redirección de datos en Bash

La redirección de datos es un elemento básico de Bash ya que nos permite controlar hacia dónde se volcarán los datos de salida de un comando o script, o de dónde obtenemos los datos de entrada.

Tenemos tres descriptores:

  • stdin: Entrada estándar.
  • stdout: Salida estándar. También se abrevia con el número 1.
  • stderr: Error estándar. También se abrevia con el número 2.

Esto nos dará varias opciones. La primera, redirigir la salida estándar a un fichero, para lo que usamos el operador >:

ls -l > fichero.txt

En el ejemplo de arriba ejecutamos el comando ls -l pero le decimos que nos guarde el resultado en un fichero. Ahora vamos a redirigir el error estándar a un fichero, usando el operador 2>:

grep pri * 2> error.txt

En este caso ejecutamos el comando grep pri * y lo que sacamos al fichero son los errores. Luego podemos combinar la salida y sacar la salida el estándar por el error estándar o viceversa:

#Sacamos el error estándar por la salida estándar
grep pri * 2>&1
#Sacamos la salida estándar por el error estándar
grep pri * 1>&2

Finalmente vamos a ver cómo sacar la salida y el error estándar juntos a un fichero:

grep pri * &> todo.txt

Esto es muy útil si queremos ejecutar un comando o un script en silencio, por ejemplo uno que se ejecute en una tarea programada con cron, ya que no veremos nada en pantalla pero tendremos nuestro propio log con los datos de lo ejecutado.

Comandos básicos de Linux para gestión de procesos

Un tip rápido y práctico como el de los puertos del otro día (lo estoy haciendo para un compañero de trabajo) ¿Cuáles son los comandos básicos de Linux para la gestión de procesos del servidor?:

  • ps: muestra los procesos activos.
  • ps aux: ps pero con más detalle.
  • kill pid: mata los procesos con el pid pid
  • killall proc: mata todos los procesos llamados proc
  • bg: lista los procesos parados o en segundo plano, arranca procesos parados en segundo plano.
  • fg: trae el proceso más reciente a primer plano.
  • fg n: trae el proceso n a primer plano.

Conocer los datos de nuestra placa base en Windows

En su día vimos cómo ver los datos de nuestra memoria RAM en Windows. Hoy me preguntaba un compañero del curro si podía ver los de la placa base sin tener que abrir el ordenador. Le comenté que sí, que con wmic desde una consola de comandos es posible:

wmic baseboard

Pero claro, eso sacará un churro de texto que es cosa larga y casi ilegible. Por suerte podemos filtrar qué parámetros queremos:

wmic baseboard get product,Manufacturer,version,serialnumber

De esta forma sacamos producto, fabricante, modelo y número de serie, de forma ordenadita y clara.

wmic baseboard

También es posible sacar los resultados a un fichero de texto por si nos resulta más cómodo para trabajar.

wmic baseboard > ficherotexto.txt

Usando el comando find para encontrar varias extensiones de archivo en Linux

Vamos con una entradilla sobre comandos en Linux para celebrar que hoy Microsoft se ha unido a la Linux Foundation. Sabemos que con el comando find seguido de una cadena de caracteres podemos encontrar todos los ficheros con esa extensión dentro de un directorio, veamos cómo sería la sintaxis más simplificada:

# find *.zip

La instrucción de arriba nos mostraría todos los ficheros cuyo nombre termine en .zip que estén situados en la carpeta en la que nos encontremos.

Ok, ¿y si quiero buscar varias extensiones?. Veamos ¿cómo sería el comando para buscar tanto los zip como los txt?

# find . -type f \( -name "*.zip" -o -name "*.txt" \)

Aquí ya tenemos una sintaxis un pelín más compleja, expliquemos paso a paso todo:

El . indica que queremos buscar en el directorio actual. Con -type f decimos que queremos buscar por tipo de fichero y que queremos archivos simples, no carpetas u ocultos. Entre paréntesis metemos la condición de lo que queremos buscar: con el -name indicamos que queremos buscar un patrón, que lo definimos a continuación entre comillas (el «*.zip» y el «*.txt», que vendrían a decir que queremos todo lo que acabe en esas extensiones) y el -o nos serviría como un operador lógico or. Si te fijas antes de cada paréntesis se ha introducido el carácter de escape \ para evitar posibles problemas de sintaxis.

Es decir, toda la clave es usar el -o para añadir más condiciones a la función de búsqueda, pudiendo así definir varios patrones.

Cerrar un terminal en Linux sin matar el proceso en ejecución

La idea es clara: ejecutamos un comando en segundo plano y queremos cerrar el terminal pero no matar el proceso ¿cómo lo hacemos?

Pongamos un ejemplo: queremos ejecutar rsync para copiar un volumen grande de ficheros de una carpeta a otra y queremos luego poder cerrar el terminal sin que se corte el proceso.

Lo primero es lanzar en segundo plano el rsync, para ello lo ejecutaremos añadiendo la instrucción & al final, que lo envía directamente a segundo plano (también se podría hacer con el comando bg, pero con & es más directo)

$ sudo rsync home/music/* usr/otro/home/music/ &

Y vamos con lo siguiente ¿cómo disociamos este proceso del terminal para poder cerrarlo? Pues basta con ejecutar disown

$ disown

Este comando básicamente lo que hace es impedir que el terminal envíe una orden de finalización al proceso cuando se cierra.

Otra opción es utilizar nohup, que ya lo ejecutaría disociado del terminal:

$ sudo nohup rsync home/music/* usr/otro/home/music/ &

Linux: Ver permisos de un archivo con stat, en modo octal o en modo rwx.

Si en un terminal de Linux escribimos ls -la se nos mostrarán todos los ficheros (ocultos incluídos) con su listado de permisos en modo rwx. Ver los permisos de esta forma puede resultar en cierto modo más intuitivo, pero por otra parte también es más ilegible que hacerlo en formato octal, que a pesar de no ser tan intuitivo sí es mucho más claro para comprobarlo en un sólo vistazo. ¿Cómo podemos ver estos datos en octal? Pues con comando stat seguido del parámetro -c, que nos permite definir un formato para la salida de la información. De la siguiente forma conseguiríamos verlo en formato octal:

stat -c '%n %a' *

¿Y para sacar los datos en formato rwx? Bueno, pues aparte de con ls también se puede hacer con stat, cambiando sólo un parámetro respecto al comando anterior (concretamente la a minúscula por una mayúscula):

stat -c '%n %A' *

Aquí os dejo una captura con un ejemplo:

consola stat

Cómo activar el bash de Ubuntu en Windows 10

Sí, has leído bien. En la actualización del primer aniversario de Windows 10 se incluye un programa llamado Bash-for-Windows, y sigue el supuesto enamoramiento de Nadella con Linux (que a este paso el siguiente Windows será un Linux con .NET preinstalado, cosas veredes Sancho). Este Bash-for-Windows, co-desarrollado junto a Canonical y basado en Ubuntu, permite correr de forma nativa algunas aplicaciones de Linux en Windows: no se trata de una máquina virtual, ni de un contenedor ni de una distribución de Linux completa, sino una aplicación que permite correr aplicaciones de Linux accediendo al sistema de ficheros de Windows. Ojo, sólo en Windows 10 de 64 bits, los usuarios de 32 bits ya no recibirán esta mejora.

Lo primero es activar el Modo Desarrollador, te vas a Configuración -> Actualizaciones y Seguridad -> Para Desarrolladores -> Modo Desarrollador. Puedes ver cómo hacerlo en este enlace si no lo ves claro con esa ruta.

Tras eso, y ya sea desde Panel de Control o desde el lanzador del Menú de Inicio, os vais a Activar o desactivar las características de Windows y allí buscais la opción de Windows Subsystem for Linux. La marcáis, dejáis que descargue todo lo necesario y que se reinicie el equipo.

WSL-Activando

Tras el reinicio abrimos la consola de comandos (cmd) en modo administrador y ejecutamos el comando bash. Una vez ejecutado por primera vez se pondrá a descargar todos los componentes necesario para instalar Bash on Ubutu on Windows.

Ejecutando Bash en Windows 10

Una vez instalado ¿qué podemos hacer con esta consola? Bueno, pues usarla para probar la funcionalidad básica de lenguajes de programación como Perl, Node/JS o Python, usar los comandos de la consola de Ubuntu como grep o awk, usar programas de línea de comandos como SSH, Emacs o Git… en fin, tendrás mucha de la funcionalidad de la consola Bash de Ubuntu en tu Windows 10.