monit
es un herramienta para monitorizar procesos, ficheros,
directorios y sistemas de ficheros, que permite enviar alertas cuando
suceden eventos tales como que un proceso no arranca, se incrementa la
carga del sistema o el uso de memoria por encima de un umbral
determinado, se modifican ficheros o directorios, etc.
El problema es que, por ahora, no permite controlar que el tamaño de un directorio, es decir, de los ficheros contenidos en él, supere cierto valor. Sin embargo, podemos conseguir este resultado utilizando un script que se ejecute de forma periódica y que modifique la fecha de un fichero concreto mientras el tamaño del directorio sea correcto. Este fichero de control nos servirá para saber cuándo se ha superado el limite.
Por ejemplo, vamos a suponer que queremos monitorizar el directorio
/var/www/uploads
y que monit
nos avise si supera los 2 GB. Para
saber el tamaño que ocupa el directorio ejecutamos:
$ du -s /var/www/uploads | awk '{print $1}' # el tamaño está en KB
Para comprobar si supera el umbral, podemos ejecutar un script como el siguiente:
#!/usr/bin/env bash
# $1: directory
# $2: size threshold in MB
# $3: control filename in monit configuration file
[ $# -lt 3 ] && exit 1
[ ! -r "$1" ] && exit 1
declare -i threshold=$(($2*1024)) # MB to KB
declare -i size=$(du -s "$1" | awk '{print $1}') # KB
if [ $size -lt $threshold ]; then
touch "$3";
fi
Lo ejecutamos y comprobamos que funciona correctamente:
$ sudo ./test_directory_size.sh /var/www/uploads 2000 /var/tmp/monit_dir_uploads
$ ls /var/tmp/monit_dir_uploads
-rw-r--r-- 1 root root 0 2012-07-22 14:48 /var/tmp/monit_dir_uploads
Lo añadimos al cron
, por ejemplo cada 10 minutos, y le pasamos los
valores adecuados:
$ sudo crontab -e
_/10 _ * _ _ /root/scripts/test_directory_size.sh /var/www/uploads 2000 /var/tmp/monit_dir_uploads > /dev/null 2>&1
La frecuencia dependerá de la urgencia que le asignemos a este evento y las consecuencias que tenga el hecho de que ocurra, así como de otros factores que limiten su aparición.
Ahora sólo queda añadir la configuración de monit
en el fichero
/etc/monit/conf.d/server.conf
. Hay que tener en cuenta el tiempo que
hemos puesto en el cron
a la hora de comprobar la fecha de
modificación del fichero.
check file monit_dir_uploads with path /var/tmp/monit_dir_uploads
if timestamp > 15 minutes then alert
Reiniciamos monit
para que los cambios tengan efecto.
Cuando ocurra que el tamaño del directorio supere el umbral, y por tanto el script deje de actualizar el fichero de control, nos llegará un aviso como el siguiente:
Timestamp failed Service monit_dir_uploads
Date: Sun, 22 Jul 2012 15:08:17 +0200
Action: alert
Host: localhost
Description: timestamp test failed for /var/tmp/monit_dir_uploads
Your faithful employee,
monit