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