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:
Posta un commento