Der Fehler ist darauf zurückzuführen, dass eines der Argumente -ge
nicht numerisch ist. Da $ALERT
ist immer numerisch, $usep
muss der Schuldige sein. Es gibt verschiedene Probleme bei der Analyse der Ausgabe, dh
die dazu führen, dass sie $usep
nicht numerisch sind.
Abhängig von der Länge der Dateisysteme dh
kann die Ausgabe in mehrere Zeilen aufgeteilt werden. Teillinien werden in Ihrem Filter abgefangen und führen zu unsinnigen Daten. Übergeben Sie dh
die -P
Option, um dieses Verhalten zu vermeiden und eine analysierbare Ausgabe zu erhalten .
Auch df
druckt 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==1
Entspricht 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/pqr
sind, 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