Monitorizando estado del disco, y graficando los resultados con gnuplot
Buenas, les traigo un pequeño aporte que le puede servir a más de uno.
En mi caso particular, el almacenamiento físico es algo critico ya que cuento con poco del mismo, por lo tanto me dispuse a realizar un script que será ejecutado por cron, para monitorizar la cantidad de disco utilizado, básicamente se apoya en 3 comandos:
df, awk y gnuplot
Para lograr el cometido, graficaré la cantidad de datos (medidos en Megabytes) que ocupa el disco actualmente, pero eso lo dejaremos para el final.
Iré construyendo la solución de a partes y empezaré con el siguiente comando:
df -BM /dev/sda1
Lo que estamos haciendo acá es pedirle a df (cuantificador de uso del disco) que formatee la salida en Megas (en potencias de 1024, para mostrar potencias de 1000, utilizaremos -BMB) y además le pediremos que nos muestre los datos solamente para la partición sda1 que es la que me interesa a mi particularmente.
Este comando tendrá una salida similar a:
S.ficheros bloques de 1M Usados Disponibles Uso% Montado en
/dev/sda1 13281M 4501M 8049M 36% /
df -BM /dev/sda1 | awk 'NR == 2 { print $3 }' >> ruta/al/archivo/$(date '+%d_%b_%Y.txt')
En mi caso particular, el almacenamiento físico es algo critico ya que cuento con poco del mismo, por lo tanto me dispuse a realizar un script que será ejecutado por cron, para monitorizar la cantidad de disco utilizado, básicamente se apoya en 3 comandos:
df, awk y gnuplot
Para lograr el cometido, graficaré la cantidad de datos (medidos en Megabytes) que ocupa el disco actualmente, pero eso lo dejaremos para el final.
Iré construyendo la solución de a partes y empezaré con el siguiente comando:
df -BM /dev/sda1
Lo que estamos haciendo acá es pedirle a df (cuantificador de uso del disco) que formatee la salida en Megas (en potencias de 1024, para mostrar potencias de 1000, utilizaremos -BMB) y además le pediremos que nos muestre los datos solamente para la partición sda1 que es la que me interesa a mi particularmente.
Este comando tendrá una salida similar a:
S.ficheros bloques de 1M Usados Disponibles Uso% Montado en
/dev/sda1 13281M 4501M 8049M 36% /
De ella observamos que tiene 2 filas y 6 columnas, pero toda esta salida no nos sirve para graficar el uso del disco a lo largo del tiempo, ya que nos interesa tener unicamente el dato "5401M" que tenemos en la fila 2 columna 3, sabiendo esto procederemos a conocer al siguiente comando: awk.
awk concretamente: "es un lenguaje de programación diseñado para procesar datos basados en texto, ya sean ficheros o flujos de datos." fuente: wikipedia.org.
Tiene una sintaxis bastante sencilla de aprender y bastante potente. Poniendo en contraste con lo que necesitamos de la salida anterior, aquí está el comando que nos permitirá sacar el dato buscado:
awk 'NR == 2 { print $3 }'
De este comando analizamos lo siguiente: '{ print $3 }' nos permite imprimir en la salida estandar la 3er columna de la salida. El único problema que tenemos ahora es que esto nos imprimirá la columna completa, incluyendo la cadena "Usados" que vemos en el ejemplo anterior. Por esto debemos poner una condición lógica como ' NR == X ' donde X sería la fila deseada.
Con esto ya estamos, finalmente si tomamos la salida del primer comando y se lo pasamos con pipe ( | ) al segundo, tendremos algo como lo siguiente:
df -BM /dev/sda1 | awk 'NR == 2 { print $3 }'
con lo cual obtendremos la salida:
4501M
Finalmente podremos redirigir esta salida a un archivo de texto al cual le colocaremos un nombre arbitrario, por ejemplo disk_usage.txt utilizando el operador >> que lo que hace es agregar una nueva línea al documento con la salida anterior y en primer lugar crearlo si este no existe. Lo que nos permitirá potenciar su uso como veremos al final del artículo, pero por ahora tenemos el siguiente comando:
df -BM /dev/sda1 | awk 'NR == 2 { print $3 }' >> ruta/al/archivo/disk_usage.txt
Ahora tendremos un archivo de texto, llamado disk_usage.txt con una serie de números que será el monto de disco utilizado, tantas líneas como veces se ejecute el comando.
Entonces podremos fácilmente graficarlo con gnuplot, de la siguiente manera:
gnuplot -p -e 'plot "/dev/stdin" with lines' < ruta/al/archivo/disk_usage.txt
o bien, para un trazo suave:
gnuplot -p -e 'plot "/dev/stdin" smooth bezier' < ruta/al/archivo/disk_usage.txt
Lo cual nos abrirá una ventana con la gráfica de los valores listados en disk_usage.txt
Ahora que tenemos esto, nos damos cuenta de que nos resulta insatisfactorio ejecutar este comando manualmente para obtener los datos, por lo tanto queremos automatizar este proceso, es por esto que recurriremos a 'cron', agregando una línea similar en /etc/crontab, con el usuario root:
0 * * * * miUsuario ruta/al/script/execute.sh
habiendo colocado en execute.sh el comando que obtiene los datos.
De esta forma, automáticamente cada una hora se ejecutará el comando, registrando el estado del disco en el archivo disk_usage.txt
Esto nos generará menos de 1Mb de información al año, así que no debemos de preocuparnos para nada.
En cuanto vayan pasando los días, podrás hacer una análisis sobre el uso del disco.
Para finalizar quiero agregar que podremos separar los archivos en 1 por día, cambiando ligeramente nuestro comando:
df -BM /dev/sda1 | awk 'NR == 2 { print $3 }' >> ruta/al/archivo/$(date '+%d_%b_%Y.txt')
Lo que estamos haciendo es utilizar el comando date para generar una fecha con el formato dd_mes_año.txt por lo que al generarse automáticamente, al pasar de un día al siguiente, también se generará un archivo nuevo!!.
Bueno esto es todo por ahora, espero que les sirva de algo, está de más aclarar que esta forma de trabajar sirve para cualquier comando y no solo para df, por lo cual las aplicaciones son infinitas.
Nos vemos!
Comentarios
Publicar un comentario