Сценарий оболочки для отправки оповещения по почте, если использование диска превышает 90%


11

Я хочу реализовать скрипт на моем сервере, который будет автоматически отправлять оповещения по электронной почте, если использование диска превышает 90%, и второе оповещение по электронной почте, когда оно превышает 95%. Моя файловая система есть abc:/xyz/abcи точка монтирования есть /pqr.

Я пробовал это:

ADMIN="someone@def.com" 
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

Но я получаю ошибку, которая говорит

line 7: [: Use: integer expression expected 

Ответы:


13

Ошибка связана с тем, что один из аргументов -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 

6

Если вы измените print на printf с помощью% d, процент станет целым числом. Пытаться:

printf("%d", $5);

который преобразует 91% в 91. Итак, последняя команда такова:

df -H | grep /dev/xvde1 | awk '{ printf "%d", $5}'

Вышеприведенная команда на английском языке: «Получить использование дискового пространства в удобочитаемом формате. Отфильтруйте с помощью grep диск, на который мы хотим посмотреть. Перенесите эту строку в awk и напечатайте 5-е слово, разделенное пробелом (пустые пустые), и отформатируйте результирующая строка в виде целого числа. Для меня команда возвращает целое число, 78что означает, что диск заполнен на 78%.


3
$ df | tail +2 | sed s/%//g | awk '{ if($5 > 90) print "Alert "$0;}'
  • df | tail +2 забирает весь вывод после пропуска первых 2 строк
  • sed s/%//g полоски процентов
  • awk ... выводит «Alert ...», если 5-е поле в выходных данных больше 90

1
Добро пожаловать в Stack Exchange! Мы ищем длинные ответы, которые дают некоторое объяснение и контекст. Не просто дать ответ в одну строку; объясните как это работает. Ответы, не содержащие объяснений, могут быть удалены.
G-Man говорит: «Восстановите Монику»

0

вот мой вариант:

#!/bin/bash

ADMIN=yermail@yerdom.com
ALERT=90
df -H | grep -vE 'abc:/xyz/pqr | tmpfs |cdrom|Used' | awk '{ print $5 " " $1 }' | while read output; do 
usep=$(echo $output | awk '{ print $1}' | cut -d'%' -f1 ) 
echo $usep
partition=$(echo $output | awk '{ print $2 }' ) 
if [ $usep -ge $ALERT ]; then 
  echo  "Alert: Almost out of disk space $usep" 
  df -H | mail -s "Alert: out of disk space $usep"  $ADMIN
fi 
done

0

Я не могу комментировать ответ Жиля выше, но просто имейте в виду, что awk выполняет сравнение на основе строк во второй части, где:

$5 >= ALERT

Я заметил это, когда тестировал однозначные пороги. Вы можете принудительно привести приведение к int, используя +0, поэтому сравнение становится:

$5+0 >= ALERT
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.