GNU/Linux >> Linux Esercitazione >  >> Linux

Script di shell per inviare un'e-mail di avviso se l'utilizzo del disco supera il 90%?

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 

Linux
  1. Determinare la shell nello script durante il runtime?

  2. Determinazione del percorso per lo script della shell di origine?

  3. Shell Script per stampare la piramide di stelle

  4. Esecuzione di script di shell in parallelo

  5. Bash monitora l'utilizzo del disco

Il significato di $? In uno script di shell?

Script o programma per registrare l'utilizzo del disco?

Come eseguire un comando in uno script della shell?

Ottieni l'utilizzo della CPU nello script della shell?

Invio di posta HTML utilizzando uno script di shell

Invio di una mail da uno script della shell Linux