L'errore è dovuto a uno degli argomenti per -ge
non essere numerico. Poiché $ALERT
è sempre numerico, $usep
deve essere il colpevole. Esistono diversi problemi con il modo in cui analizzi l'output il dh
cui risultato $usep
non è numerico.
A seconda della lunghezza dei filesystem, dh
può dividere il suo output su più righe. Le linee parziali verranno catturate nel filtro e genereranno dati senza senso. Per evitare questo comportamento e ottenere risultati analizzabili dh
, passare l' -P
opzione.
df
Stampa anche una riga di intestazione che si tradurrà nuovamente in dati privi di senso.
Il tuo filtro è piuttosto complesso. Vorrei usare un singolo passaggio di awk. Del resto, potresti fare il filtro sulla percentuale all'interno di awk (ma non l'ho fatto nel seguente script).
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 abc:/xyz/pqr
, ma il tuo codice lo esclude). L'ultima riga awk rimuove la %
dalla colonna percentuale prima di stamparla.
Sarebbe più bello inviare una sola 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