venerdì 1 agosto 2008

Controllare lo spazio disco di un server

Lo script che presento di seguito viene utilizzato in combinazione con cron per il controllo periodico dell'utilizzo dei dischi e delle partizioni di un server. Qualora lo spazio disco superi una soglia percentuale (ad es. il 95%) della sua capacità totale, allora viene inviata una e-mail di notifica.
L'idea è quella di usare il comando df per ottenere le informazioni su ogni filesystem in uso nel sistema, e di verificare se la quantità percentuale di spazio disponibile sia inferiore alla soglia. Nel caso lo spazio disponibile sia inferiore alla soglia percentuale fissata, viene visualizzato un messaggio sullo standard output e, tramite tee, salvato in un file. Tale file viene poi inviato via e-mail ai destinatari della notifica.

#!/bin/bash

PROGRAM_VERSION=1.0


DF_CMD=`which df`
GREP_CMD=`which grep`
AWK_CMD=`which awk`
SED_CMD=`which sed`
EXPR_CMD=`which expr`
MAIL_CMD=`which mail`
MSG_FILE=/tmp/diskSpace.$$
HOSTNAME_CMD=`which hostname`
DATE_CMD=`which date`
BASENAME_CMD=`which basename`
RM_CMD=`which rm`
BASENAME_CMD=`which basename`
TEE_CMD=`which tee`
SEND_EMAIL="false"

# prelevo la soglia di controllo
THRESHOLD=90
if [ $# -ge 1 ]
then
THRESHOLD=$1
shift # escludo altri parametri da linea di comando
fi


# Creazione del file temporaneo per il report.
SERVER_NAME=`$HOSTNAME_CMD`
PROGRAM_NAME=`$BASENAME_CMD $0`
echo "Report sullo stato dei dischi del server $SERVER_NAME" > $MSG_FILE
echo "generato in data " `$DATE_CMD` >> $MSG_FILE
echo "dal programma $PROGRAM_NAME versione $PROGRAM_VERSION" >> $MSG_FILE
echo "----------------------------------------------------------" >> $MSG_FILE


OLD_IFS=$IFS
IFS=$'\n'

for line in `$DF_CMD -Pha`
do
FILESYSTEM=`echo $line | $AWK_CMD '{print $1;}'`
BUSY=`echo $line | $AWK_CMD '{print $5;}' | $SED_CMD 's/%//'`
MOUNT_POINT=`echo $line | $AWK_CMD '{print $6;}'`

# controllo che lo spazio sia effettivamente un numero,
# per evitare di controllare la linea di instestazione
# o altre linee non utili
`$EXPR_CMD $BUSY + 0 > /dev/null 2>&1`
if [ $? -eq 0 ]
then

# controllo se questo file system supera la soglia stabilita
if [ $BUSY -ge $THRESHOLD ]
then
echo "Attenzione: partizione $FILESYSTEM ($MOUNT_POINT) occupata al $BUSY% (soglia fissata al $THRESHOLD%)" | $TEE_CMD -a $MSG_FILE
SEND_EMAIL="true"
fi
fi

done

IFS=$OLD_IFS

# devo inviare per e-mail la notifica?
if [ $# -ge 1 ]
then
if [ "$SEND_EMAIL" = "true" ]
then
for addressee in $*
do
$MAIL_CMD -s "$SERVER_NAME: partizioni occupate oltre la soglia!" $addressee < $MSG_FILE
done
fi
fi

# rimozione del file temporaneo
$RM_CMD $MSG_FILE

Nessun commento: