martes, 2 de noviembre de 2010

Liberación de recursos & | dispositivos ocupados en GNU/Linux

Tengo que reconocer que cuando comenze a dar mis primeros pasos en GNU/Linux y que tenia necesidad de liberar algun recurso me encontre con la siguiente leyenda:

En aquellos años penosamente tenia que reiniciar para liberar. Lo que en aquellos años no sabia es que con la ayuda del comando lsof, podemos apoyarnos para revisar archivos abiertos. Este comando nos muestra en columnas los siguientes campos relacionados a un proceso:
  • Comando.
  • Id del Proceso ( PID )
  • Usuario.
  • Nombre del nodo.
Aqui lo que nos puede resultar util es el nombre del nodo y el PID. Por ejemplo, supongamos que queremos liberar el lector optico para leer otro disco y a pesar de que cerramos nuestras aplicaciones no podemos desmontar. El cdrom estara asociado al nodo /dev/cdrom y montado en /media, nosotros podriamos hacer lo siguiente:

lsof | grep /media

El cual nos mostrara los procesos que estan haciendo uso de este recurso y asi podriamos matarlos con kill, para cada proceso y subproceso que se muestren. ¿y si son muchos? Podemos usar el nuevo juguete que me paso mi amigo Daniel Mtz.

for cadauno in ` lsof | grep /media | awk '{ print $1 }' `; kill $cadauno 2> /dev/null ; done

Con esto automatizamos para que cada proceso encontrado sea eliminado. Este comando y sus parámetros pueden hacer muchas cosas por nosotros, para concluir veamos algunos ejemplos:

#Archivos abiertos del PID 1
lsof -p 1

#Procesos que estan usado el puerto TCP 22 y UDP 53
lsof -i :22
lsof -i UDP:53

jueves, 12 de agosto de 2010

Catching process from devil with Bash

Cuando se tiene la necesidad de buscar procesos que consuman mucho recurso de computo como memoria o cpu, pero una limitante es lo poco practico de estar detras del comando top todo el tiempo, se nos obliga a pensar el automatizar esta busqueda y que asi nos de tiempo de salir a comer algo o dormir un poco.

En esta ocacion les presento un script que nos ayuda a buscar procesos que consumen mas de 50% de cpu y nos guarda en una bitacora la informacion de este procesos. Desde luego que se le pueden hacer mejoras pero las dejaremos al criterio del usuario. Espero les sea de utilidad.



#!/bin/bash
#Variable para solo encontrar un proceso
status=0

while [ $status -eq 0 ] ;
do
cont=`ps aux | awk '$3>50 { print }' | wc -l`
if [ $cont -gt 0 ]; then
ps aux | awk '$3>50 { print }' >> procesos.txt
date >> procesos.txt
#Podriamos ponerlo a 1 para solo encontrar 1 proceso
status=0
fi

echo scanning...
#esperamos 5 minutos para volver a buscar
sleep 300
done

martes, 22 de junio de 2010

Bash Scripting: Recursive Search inside text files

Anteriormente había tenido la necesidad de hacer búsquedas recursivas de alguna cadena, en todos los archivos de texto de un árbol de directorios. Un ejemplo típico es un parámetro o valor usado por algún aplicativo y que no recordamos claramente en que archivo de conflagración esta, en este contexto es donde personalmente he tenido la necesidad de una herramienta así.

Les quiero compartir un script que realiza precisamente este tipo de búsquedas, este script bien se puede adaptar para realizar operaciones sobre estos archivos, permisos, modificaciones, borrados, etc. Sin embargo eso ya queda de tarea de acuerdo a sus necesidades.


#!/bin/bash

if [ "$#" != "1" ]; then
echo "usage: finder ";
exit 1;
fi

#Se consigue un listado recursivo de los archivos en el directorio actual y subdirectorios
du -a * | awk 'BEGIN{"pwd" | getline LOCAL_PATH}{print LOCAL_PATH "/" $2}' | (
#Hacemos la lectura "filebyfile" o "linebyline"
while read line; do
#Solo buscamos en archivos de texto
file $line | grep text > /dev/null;
if [ "$?" -eq "0" ]; then
echo "*** Archivo de texto: $line";
cat $line | grep $1;
echo "";
fi
done
);
exit 0;

miércoles, 2 de junio de 2010

PackETH, Builder of RAW TCP/IP Packet

Hace algunos meses encontre en los repositorios de Ubuntu, una herramienta para la construcción de paquetes TCP/IP, el PackETH. Durante mis épocas de estudiante hacíamos pruebas personalizando paquetes con raw sockets en lenguaje C (¿que..., hay otro?). El desarrollo con raw sockets a pesar de fácil, puede ser en algún momento un poco confuso, sobre todo por los nombres de los elementos de las estructuras de datos usadas y su respectiva referencia y/o relación con el TCP/IP.
A modo de presentación de esta herramienta, se realizaron unas pruebas en una topología tan simple como la que muestra la figura anterior, una red local y un servidor de internet. En la computadora de la red local tenemos la dirección MAC 90:4C:E5:63:71:C9 y la dirección de red 192.168.1.100, los detalles pueden observar en la siguiente imagen.
Usando el PackETH, construimos un paquete ICMP, dirigido a un servidor de google. Haciendo un paréntesis, debemos saber que cuando un paquete cruza parcialmente la nube de internet y pasa por varios routers, en cada salto algunos campos se comportan de la siguiente manera:
  • MAC Origen: En cada salto cambia y es sustituida por el dispositivo que esta enviando o reenviando la trama, colocando su propia MAC Address.
  • MAC Destino: En cada salto cambia y es sustituida por el dispositivo que esta enviando o reenviando la trama, colocando la MAC Address del equipo que recibe la trama y que esta dentro de su segmento.
  • IP Origen: Solo llega a cambiar cuando salimos de alguna red local y el gateway hace un enmascaramiento, sustituyendo la IP origen que le llega por la que tiene el propio Gateway.
  • IP Destino: Nunca cambia!.
Conociendo la información anterior, seguimos con la instrucción del paquete, llenado los campos de la siguiente manera. Una vez terminado definimos la interfaz de salida, y damos clic a "Send". El paquete en ese momento es liberado en la ostil y lenta, red publica. Para verificar la entrega del paquete, podemos consultar algún sniffer, en este caso nos apoyamos de wireshark, donde podemos ver que el paquete se envía y recibe correctamente. Espero esta información puede ser de mucha ayuda para algunas personas.