Ошибка связана с тем, что один из аргументов -ge
не является числовым. Так $ALERT
как всегда числовой, $usep
должен быть виновником. Есть несколько проблем, связанных с тем, как вы анализируете выходные данные, dh
которые $usep
не являются числовыми.
В зависимости от длины файловых систем, dh
может разбить свой вывод на несколько строк. Частичные строки будут пойманы в вашем фильтре и приведут к бессмысленным данным. Чтобы избежать такого поведения и получить анализируемый вывод dh
, передайте -P
опцию.
Также df
печатает строку заголовка, которая снова приведет к бессмысленным данным.
Ваш фильтр довольно сложный. Я бы использовал один проход awk. В этом отношении вы можете выполнить фильтрацию по процентам внутри awk (но я не делал этого в следующем скрипте).
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
соответствует первой строке, поэтому NR==1 {next}
пропускает первую строку. Следующие несколько строк исключают некоторые файловые системы (обратите внимание, что ваше описание говорит, что вы заинтересованы abc:/xyz/pqr
, но ваш код исключает это). Последняя строка awk удаляет %
столбец процента перед печатью.
Было бы лучше отправлять одно сообщение обо всех файловых системах. На этот раз я делаю весь анализ в 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