Script di shell per inviare un messaggio di avviso se l'utilizzo del disco supera il 90%


11

Voglio implementare uno script sul mio server che invierà automaticamente avvisi e-mail se l'utilizzo del disco supera il 90% e il secondo avviso e-mail quando supera il 95%. Il mio filesystem è abc:/xyz/abce il punto di mount è /pqr.

Ho provato questo:

ADMIN="someone@def.com" 
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 sto ricevendo un errore che dice

line 7: [: Use: integer expression expected 

Risposte:


13

L'errore è dovuto a uno degli argomenti per -genon essere numerico. Poiché $ALERTè sempre numerico, $usepdeve essere il colpevole. Esistono diversi problemi con il modo in cui analizzi l'output il dhcui risultato $usepnon è numerico.

A seconda della lunghezza dei filesystem, dhpuò 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' -Popzione.

dfStampa 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==1corrisponde 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 

6

Se cambi print in printf usando% d, la percentuale diventerà un numero intero. Provare:

printf("%d", $5);

che convertirà il 91% in 91. Quindi il comando finale è questo:

df -H | grep /dev/xvde1 | awk '{ printf "%d", $5}'

Il comando precedente in inglese: "Ottieni l'utilizzo dello spazio su disco in un formato leggibile dall'uomo. Filtra con grep sul disco che vogliamo guardare. Installa quella riga su awk e stampa la quinta parola delimitata dallo spazio (svuota rimosso), e formatta la stringa risultante come numero intero. Per me il comando restituisce il numero intero, il 78che significa che il disco è pieno al 78%.


3
$ df | tail +2 | sed s/%//g | awk '{ if($5 > 90) print "Alert "$0;}'
  • df | tail +2 prende tutto l'output dopo aver saltato le prime 2 righe
  • sed s/%//g spoglia segni di percentuale
  • awk ... stampa "Avviso ..." se il quinto campo nell'output è un numero maggiore di 90

1
Benvenuto in Stack Exchange! Siamo alla ricerca di risposte lunghe che forniscano qualche spiegazione e contesto. Non dare solo una risposta di una riga; spiega come funziona. Le risposte che non includono spiegazioni potrebbero essere rimosse.
G-Man dice "Reinstate Monica"

0

ecco la mia variante:

#!/bin/bash

ADMIN=yermail@yerdom.com
ALERT=90
df -H | grep -vE 'abc:/xyz/pqr | tmpfs |cdrom|Used' | awk '{ print $5 " " $1 }' | while read output; do 
usep=$(echo $output | awk '{ print $1}' | cut -d'%' -f1 ) 
echo $usep
partition=$(echo $output | awk '{ print $2 }' ) 
if [ $usep -ge $ALERT ]; then 
  echo  "Alert: Almost out of disk space $usep" 
  df -H | mail -s "Alert: out of disk space $usep"  $ADMIN
fi 
done

0

Non sono in grado di commentare la risposta di Gilles sopra, ma sappi solo che awk sta facendo un confronto basato su stringhe nella seconda parte, dove:

$5 >= ALERT

L'ho notato mentre stavo testando soglie a una cifra. Puoi forzare un cast a int usando +0, quindi il confronto diventa:

$5+0 >= ALERT
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.