Shell-Skript zum Senden einer Warnmail, wenn die Festplattennutzung 90% überschreitet

11

Ich möchte ein Skript auf meinem Server implementieren, das automatisch E-Mail-Benachrichtigungen sendet, wenn die Festplattenauslastung 90% überschreitet, und eine zweite E-Mail-Benachrichtigung, wenn sie 95% überschreitet. Mein Dateisystem ist abc:/xyz/abcund der Einhängepunkt ist /pqr.

Ich habe das versucht:

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

Aber ich bekomme einen Fehler, der besagt

line 7: [: Use: integer expression expected 
Rui F Ribeiro
quelle

Antworten:

13

Der Fehler ist darauf zurückzuführen, dass eines der Argumente -genicht numerisch ist. Da $ALERTist immer numerisch, $usepmuss der Schuldige sein. Es gibt verschiedene Probleme bei der Analyse der Ausgabe, dhdie dazu führen, dass sie $usepnicht numerisch sind.

Abhängig von der Länge der Dateisysteme dhkann die Ausgabe in mehrere Zeilen aufgeteilt werden. Teillinien werden in Ihrem Filter abgefangen und führen zu unsinnigen Daten. Übergeben Sie dhdie -POption, um dieses Verhalten zu vermeiden und eine analysierbare Ausgabe zu erhalten .

Auch dfdruckt eine Kopfzeile , die wieder in unsinnigen Daten führen.

Ihr Filter ist ziemlich komplex. Ich würde einen einzigen Durchgang von awk verwenden. Im Übrigen können Sie den Prozentsatz in awk filtern (aber ich habe ihn im folgenden Skript nicht durchgeführt).

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==1Entspricht der ersten Zeile, NR==1 {next}überspringt also die erste Zeile. In den nächsten Zeilen werden einige Dateisysteme ausgeschlossen (beachten Sie, dass Ihre Beschreibung angibt, dass Sie interessiert abc:/xyz/pqrsind, Ihr Code dies jedoch ausschließt). Die letzte awk-Zeile entfernt die %Spalte aus der Prozentspalte, bevor sie gedruckt wird.

Es wäre schöner, eine einzige Mail über alle Dateisysteme zu senden. Dieses Mal mache ich die ganze Analyse 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 
Gilles 'SO - hör auf böse zu sein'
quelle
6

Wenn Sie print mit% d in printf ändern, wird der Prozentsatz zu einer Ganzzahl. Versuchen:

printf("%d", $5);

Dies wird 91% in 91 umwandeln. Der letzte Befehl lautet also:

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

Der obige Befehl in Englisch: "Holen Sie sich die Speicherplatznutzung in einem für Menschen lesbaren Format. Filtern Sie mit grep nach unten auf die Festplatte, die wir uns ansehen möchten. Leiten Sie diese Zeile an awk und drucken Sie das fünfte durch Leerzeichen begrenzte Wort (Leergut entfernt) und Format Die resultierende Zeichenfolge als Ganzzahl. Für mich gibt der Befehl die Ganzzahl zurück, 78was bedeutet, dass die Festplatte zu 78% voll ist.

SeanO
quelle
3
$ df | tail +2 | sed s/%//g | awk '{ if($5 > 90) print "Alert "$0;}'
  • df | tail +2 Übernimmt die gesamte Ausgabe nach dem Überspringen der ersten beiden Zeilen
  • sed s/%//g Streifen Prozentzeichen
  • awk ... Gibt "Alarm ..." aus, wenn das 5. Feld in der Ausgabe eine Zahl größer als 90 ist
Ashis Lenka
quelle
1
Willkommen bei Stack Exchange! Wir suchen nach langen Antworten, die Erklärungen und Zusammenhänge liefern. Geben Sie nicht nur eine einzeilige Antwort. erklären, wie es funktioniert. Antworten, die keine Erklärungen enthalten, werden möglicherweise entfernt.
G-Man sagt "Reinstate Monica"
0

Hier ist meine 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
fyg
quelle
0

Ich kann Gilles Antwort oben nicht kommentieren, aber sei dir nur bewusst, dass awk im zweiten Teil einen stringbasierten Vergleich durchführt, wobei:

$5 >= ALERT

Ich habe dies bemerkt, als ich einstellige Schwellenwerte getestet habe. Sie können eine Umwandlung mit +0 auf int erzwingen, sodass der Vergleich wie folgt lautet:

$5+0 >= ALERT
kmac
quelle