GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Shell-Skript zum Senden einer Warn-E-Mail, wenn die Festplattennutzung 90 % überschreitet?

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

Ich habe dies 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 erhalte eine Fehlermeldung, die besagt:

line 7: [: Use: integer expression expected 

Akzeptierte Antwort:

Der Fehler ist auf eines der Argumente für -ge zurückzuführen nicht numerisch sein. Seit $ALERT ist immer numerisch, $usep muss der Übeltäter sein. Es gibt mehrere Probleme mit der Art und Weise, wie Sie die Ausgabe von dh parsen was zu $usep führt nicht numerisch.

Je nach Länge der Dateisysteme wird dh kann seine Ausgabe auf mehrere Zeilen aufteilen. Teilzeilen werden von Ihrem Filter erfasst und führen zu unsinnigen Daten. Um dieses Verhalten zu vermeiden und eine parsbare Ausgabe von dh zu erhalten , übergeben Sie das -P Option.

Auch df druckt eine Kopfzeile, die wiederum zu unsinnigen Daten führt.

Dein Filter ist ziemlich komplex. Ich würde einen einzigen Durchlauf von awk verwenden. Für diese Angelegenheit könnten Sie die Filterung nach dem Prozentsatz innerhalb von awk durchführen (aber ich habe dies im folgenden Skript nicht getan).

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 stimmt mit der ersten Zeile überein, also NR==1 {next} überspringt die erste Zeile. Die nächsten paar Zeilen schließen einige Dateisysteme aus (beachten Sie, dass Ihre Beschreibung besagt, dass Sie an abc:/xyz/pqr interessiert sind , aber Ihr Code schließt es aus). Die letzte awk-Zeile entfernt den % aus der Prozentspalte, bevor Sie es drucken.

Es wäre schöner, eine einzige Mail über alle Dateisysteme zu senden. Diesmal mache ich die gesamte 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 

Linux
  1. Senden Sie eine E-Mail vom Linux-Terminal oder Skript mit dem Befehl mail

  2. Shell im Script zur Laufzeit ermitteln?

  3. Bestimmen des Pfads zum bezogenen Shell-Skript?

  4. Die Bedeutung von $? In einem Shell-Skript?

  5. Shell-Skript parallel ausführen

Wie führe ich einen Befehl in einem Shell-Skript aus?

CPU-Auslastung im Shell-Skript abrufen?

Senden von HTML-Mails mit einem Shell-Skript

Senden einer E-Mail von einem Linux-Shell-Skript

Berechnung des gerundeten Prozentsatzes in Shell Script ohne Verwendung von bc

Transliterationsskript für die Linux-Shell