Voglio implementare uno script sul mio server che invierà automaticamente avvisi e-mail se l'utilizzo del disco supera il 90% e un secondo avviso e-mail quando supera il 95%. Il mio filesystem è abc:/xyz/abc
e il punto di montaggio è /pqr
.
Ho provato questo:
ADMIN="[email protected]"
ALERT=90
df -H | grep -vE 'abc:/xyz/pqr | tmpfs |cdrom' | awk '{ print $5 " " $1 }' | while read output; do
usep=$(echo $output | awk '{ print $1}' | cut -d'%' -f1 )
partition=$(echo $output | awk '{ print $2 }' )
if [ $usep -ge $ALERT ]; then
mail -s "Alert: Almost out of disk space $usep" $ADMIN
fi
done
Ma ricevo un errore che dice
line 7: [: Use: integer expression expected
Risposta accettata:
L'errore è dovuto a uno degli argomenti di -ge
non essere numerico. Da $ALERT
è sempre numerico, $usep
deve essere il colpevole. Ci sono diversi problemi con il modo in cui analizzi l'output di dh
che risultano in $usep
non essendo numerico.
A seconda della lunghezza dei filesystem, dh
può dividere il suo output su più righe. Le righe parziali verranno catturate nel filtro e risulteranno in dati privi di senso. Per evitare questo comportamento e ottenere un output analizzabile da dh
, passa il -P
opzione.
Anche df
stampa una riga di intestazione che di nuovo risulterà in dati privi di senso.
Il tuo filtro è piuttosto complesso. Userei un singolo passaggio di awk. Del resto, potresti eseguire il filtraggio sulla percentuale all'interno di awk (ma non l'ho fatto nello script seguente).
df -H | awk '
NR == 1 {next}
$1 == "abc:/xyz/pqr" {next}
$1 == "tmpfs" {next}
$1 == "/dev/cdrom" {next}
1 {sub(/%/,"",$5); print $1, $5}
' | while read filesystem percentage; do
if [ "$percentage" -ge "$ALERT" ]; then
mail -s "Alert: Almost out of disk space ($usep%) on $filesystem" "$ADMIN"
fi
done
NR==1
corrisponde alla prima riga, quindi NR==1 {next}
salta la prima riga. Le prossime righe escludono alcuni filesystem (nota che la tua descrizione dice che sei interessato a abc:/xyz/pqr
, ma il tuo codice lo esclude). L'ultima riga awk rimuove il %
dalla colonna percentuale prima di stamparla.
Sarebbe più carino inviare una singola mail su tutti i filesystem. Questa volta sto facendo tutte le analisi in awk.
message=$(df -h | awk -v ALERT="$ALERT" '
NR == 1 {next}
$1 == "abc:/xyz/pqr" {next}
$1 == "tmpfs" {next}
$1 == "/dev/cdrom" {next}
1 {sub(/%/,"",$5)}
$5 >= ALERT {printf "%s is almost full: %d%%n", $1, $5}
')
if [ -n "$message" ]; then
echo "$message" | mail -s "Alert: Almost out of disk space" "$ADMIN"
fi