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