Зачем это нужно?
Нехватка свободного места на дисках сервера может привести к сбоям в работе приложений, потере данных и другим критическим проблемам. Регулярный мониторинг позволяет предотвратить такие ситуации. В этой статье представлен bash-скрипт, который проверяет свободное место на указанных дисках и отправляет email-уведомления при достижении заданных пороговых значений.
Шаг 1: Создание скрипта
Скрипт использует утилиту df
для проверки свободного места и mail
для отправки уведомлений.
Особенности:
- Поддержка мониторинга нескольких дисков.
- Настройка порогов для предупреждений (warning) и критических состояний (critical).
- Отправка email-оповещений (по желанию).
- Гибкая настройка через аргументы командной строки.
Код скрипта (адаптируйте переменные под свою систему):
bash
#########################################################################
#########################################################################
# #
# Этот скрипт проверяет свободное место на указанных дисках и отправляет#
# email-оповещения при достижении пороговых значений для предупреждения #
# (warning) и критического состояния (critical). #
# #
# Пороги можно задать через аргументы командной строки. Пример запуска: #
# #
# "bash /путь/к/скрипту.sh -w 20 -c 10 -d /dev/sda1 -d /" #
# #
# Скрипт проверит /dev/sda1 и корневой диск (/). Отправит предупреждение#
# при свободном месте < 20% и критическое оповещение при < 10%. #
# #
# Значения по умолчанию: #
# - Порог предупреждения: 20% #
# - Порог критического состояния: 10% #
# - Проверяемый диск: / (корневой) #
# #
#########################################################################
#########################################################################
### Инициализация переменных
## Для включения email-оповещений установите ENABLE_EMAIL_ALERT=1
ENABLE_EMAIL_ALERT=1
NOTIFICATION_EMAIL="ваша_почта@example.com"
## Раскомментируйте для задания кастомного имени хоста (по умолчанию - системное)
#HOSTNAME="web-server1"
## Служебные переменные
THRESHOLD_WARNING=20 # В процентах
THRESHOLD_CRITICAL=10 # В процентах
WARNING=0
CRITICAL=0
WARNING_ALERT=0
CRITICAL_ALERT=0
### Создание временного файла для письма
mail_content=`mktemp`
### Обработка аргументов командной строки
while getopts ":w:c:d:" option; do
case ${option} in
w)
THRESHOLD_WARNING=${OPTARG}
;;
c)
THRESHOLD_CRITICAL=${OPTARG}
;;
d)
set -f
disks+=($OPTARG)
;;
esac
done
### Функция отправки уведомления
send_notification(){
echo "Отправка email-уведомления на ${NOTIFICATION_EMAIL}"
SUBJECT="${1} ОПОВЕЩЕНИЕ: Проверка дисков на хосте $HOSTNAME"
mail -s "${SUBJECT}" "${NOTIFICATION_EMAIL}" < "${mail_content}"
}
### Функция проверки свободного места на диске
check_disk_space(){
local total_used_space=`df -h $1 | awk '{print $5}' | tail -1`
local used_space_percent=`echo ${total_used_space:0:-1}`
local free_space_percent=$(( 100 - $used_space_percent ))
if (( $free_space_percent <= ${THRESHOLD_CRITICAL} )); then
CRITICAL=1
return 2
elif (( $free_space_percent <= ${THRESHOLD_WARNING} )); then
WARNING=1
return 1
else
OK=1
return 0
fi
}
### Если диски не указаны, выбираем корневой диск (/)
if [ ${#disks[@]} -lt 1 ]; then
echo "Диски не указаны. По умолчанию выбран корневой диск (/)"
disks[0]="/"
fi
### Формирование содержимого письма
echo "Внимание:
На хосте \"${HOSTNAME}\" заканчивается место на одном или нескольких дисках.
" >> ${mail_content}
echo ":: УСЛОВИЯ ПРОВЕРКИ"
echo "-- Предупреждение при свободном месте < ${THRESHOLD_WARNING}%"
echo "-- Критическое состояние при свободном месте < ${THRESHOLD_CRITICAL}%"
echo ":: ПРОВЕРЯЕМЫЕ ДИСКИ"
echo "-- Список дисков: ${disks[@]}"
### Проверка каждого диска
for disk in "${disks[@]}"; do
check_disk_space "${disk}"
if [ ${CRITICAL} -eq 1 ]; then
echo " => Диск \"${disk}\" в критическом состоянии" | tee -a ${mail_content}
CRITICAL_ALERT=1
CRITICAL=0
elif [ ${WARNING} -eq 1 ]; then
echo " => Диск \"${disk}\" в состоянии предупреждения" | tee -a ${mail_content}
WARNING_ALERT=1
WARNING=0
else
echo " => Диск \"${disk}\" в норме"
fi
done
### Завершение письма
echo "
--
С уважением,
$HOSTNAME" >> ${mail_content}
### Отправка уведомлений
if [ ${CRITICAL_ALERT} -ne 0 ]; then
[[ $ENABLE_EMAIL_ALERT -eq 1 ]] && send_notification "КРИТИЧЕСКОЕ"
elif [ ${WARNING_ALERT} -ne 0 ]; then
[[ $ENABLE_EMAIL_ALERT -eq 1 ]] && send_notification "ПРЕДУПРЕЖДЕНИЕ"
else
echo "Все диски в норме!"
fi
##################### Конец скрипта ############################
Шаг 2: Аргументы командной строки
Скрипт принимает параметры:
-w N
: Установить порог для предупреждения (в процентах).-c N
: Установить порог для критического состояния (в процентах).-d /path
: Указать диск или точку монтирования для проверки. Можно использовать несколько раз.
Примеры запуска:
bash
# Проверка корневого диска с порогами 20% (warning) и 10% (critical) bash check_disk_space.sh # Проверка дисков / и /dev/sda1 с порогами 30% и 15% bash check_disk_space.sh -w 30 -c 15 -d / -d /dev/sda1
Шаг 3: Настройка переменных
- Включение email-уведомлений:
УстановитеENABLE_EMAIL_ALERT=1
и укажите email вNOTIFICATION_EMAIL
. - Имя сервера:
Раскомментируйте строкуHOSTNAME
, чтобы задать кастомное имя в уведомлениях.
Шаг 4: Автоматизация через cron
Добавьте задание в cron для регулярного выполнения скрипта. Например, для ежечасной проверки:
bash
crontab -e # Добавьте строку: 0 * * * * bash /путь/к/check_disk_space.sh -w 20 -c 10 -d /
Заключение
Скрипт позволяет автоматизировать мониторинг дискового пространства, своевременно оповещая о потенциальных проблемах. Его можно адаптировать под любую инфраструктуру, изменяя пороги, список дисков и настройки уведомлений.