отправка электронной почты, если дисковое пространство превышает

У меня есть скрипт для расчета доступного дискового пространства и оповещения по электронной почте, если ограничение превышает заданное мной значение. Вот сценарий:

df -H | grep -vE '^Filesystem|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
    MessageSpace="Running out of space \"$partition ($usep%)\" on $(hostname) as on $(date)"
    spacealert
    fi
done

Теперь проблема в том, что если у меня есть два диска, предел которых превысил заданный предел, то он сгенерирует две отдельные почты. Могу ли я сделать это, чтобы отправить мне только одно электронное письмо? Благодарю.

1
задан 12 December 2013 в 10:24

1 ответ

Один из подходов заключается в создании временного файла и записи в него любых предупреждений о чрезмерном использовании. Если после прохождения всех разделов файл не пуст, отправляется электронное сообщение:

tmpfile="$HOME/.fs_usage_check.tmp"
echo -n "" >"$tmpfile"
df -H | grep -vE '^Filesystem|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
        echo "Running out of space \"$partition  ($usep%)\" on $(hostname) as on $(date)" >>"$tmpfile"
    fi
done
if [ -s "$tmpfile" ] ; then
    mail  -s "Disk Space Warning" someone@host <"$tmpfile"
fi
rm -f "$tmpfile"

Я не знаком с утилитой spacealert, которую вы использовали, поэтому я подставил mail для отправки электронного письма.

Между прочим, я думаю, что операторы awk / while / read могут быть немного упрощены:

tmpfile="$HOME/fs_usage_check.tmp"
echo -n "" >"$tmpfile"
df -H | grep -vE '^Filesystem|tmpfs|cdrom' | awk '{ print $1,$5 }' | while read partition usep ; do
    if [ ${usep%%%} -ge $Alert ]; then
        echo "Running out of space \"$partition  ($usep)\" on $(hostname) as on $(date)" >>"$tmpfile"
    fi
done
if [ -s "$tmpfile" ] ; then
    mail  -s "Disk Space Warning" someone@host <"$tmpfile"
fi
rm -f "$tmpfile"

В этой упрощенной форме переменная usep немного меняется: она все еще имеет '% знак прилагается. Нам нужно удалить знак процента, чтобы сделать числовое сравнение. Bash имеет специальный параметр расширения для удаления таких суффиксов, который выглядит как ${var%pattern} или, для удаления самого длинного суффикса соответствия шаблону, ${var%%pattern}. В нашем случае, поскольку сам шаблон является знаком процента, так же, как и магический символ bash, нам необходимо либо избежать его (как в ${usep%\%}), либо использовать команду наименьшего совпадения (как в ${usep%%%}).

Обратите внимание, что цикл do while находится в конвейере и, следовательно, в подоболочке (я предполагаю, что вы используете bash или dash или подобную оболочку). Таким образом, ни одна из его переменных среды не выживает вне цикла. Временный файл, конечно, сохраняется, и это хорошо для сигнализации о том, следует ли отправлять сообщение.

0
ответ дан 12 December 2013 в 10:24
  • 1
    таким образом, я должен обновить свою систему до 14,04. Спасибо за Вашу справку. – Rizaldi Maulidia 6 June 2015 в 08:11

Другие вопросы по тегам:

Похожие вопросы: