Автоматический мониторинг дискового пространства с помощью bash-скрипта

  • Автор записи:
  • Рубрика записи:Linux
  • Комментарии к записи:0 комментариев

Зачем это нужно?
Нехватка свободного места на дисках сервера может привести к сбоям в работе приложений, потере данных и другим критическим проблемам. Регулярный мониторинг позволяет предотвратить такие ситуации. В этой статье представлен 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: Настройка переменных

  1. Включение email-уведомлений:
    Установите ENABLE_EMAIL_ALERT=1 и укажите email в NOTIFICATION_EMAIL.
  2. Имя сервера:
    Раскомментируйте строку HOSTNAME, чтобы задать кастомное имя в уведомлениях.

Шаг 4: Автоматизация через cron

Добавьте задание в cron для регулярного выполнения скрипта. Например, для ежечасной проверки:

bash

crontab -e
# Добавьте строку:
0 * * * * bash /путь/к/check_disk_space.sh -w 20 -c 10 -d /

Заключение

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

Добавить комментарий