В этой статье разберём на примере Ubuntu/Debian:
- как настроить простые алерты по высокой нагрузке (load average) на VPS;
- как следить за нехваткой свободного места на диске;
- как отправлять уведомления на e-mail через cron;
- как тестировать алерты и не ловить лишний спам.
Что будем мониторить и какие пороги задать
Чтобы не устроить себе «шторма» из писем, нужно заранее определиться с порогами.
1. Высокая нагрузка (load average)
Показатель load average показывает, сколько задач одновременно ждут CPU и диск. Смотрим его, например, командой:
uptime
Для простоты будем использовать первый показатель (за 1 минуту). Базовая логика такая:
на 1 vCPU критично, когда
load>= 2–3;на 2 vCPU — когда
loadпостоянно выше 4 и дальше растёт;на 4 vCPU — когда значения держатся сильно выше 8.
В скрипте мы просто зададим свой порог, например:
MAX_LOAD=4
2. Свободное место на диске
Для диска ориентируемся по проценту занятого пространства на корневом разделе /. Смотреть можно так:
df -h /
Порог имеет смысл ставить на уровне 80–90%:
при 80% — «жёлтый» уровень: пора почистить логи и бэкапы;
при 90% и выше — «красный»: скоро начнутся ошибки записи и падения сервисов.
В скрипте будем использовать, например:
MAX_DISK_USAGE=90
Важно: это базовые, «на глаз» пороги. Для своих проектов можно задать более строгие значения.
Готовим скрипт проверки нагрузки и диска
Сделаем один скрипт, который:
замеряет текущий
load averageи использование диска;если порог превышен — отправляет письмо на указанный e-mail;
если всё хорошо — молчит.
1. Создаём файл скрипта
Открываем новый файл, например в /usr/local/bin:
sudo nano /usr/local/bin/vps-health-check.sh
Вставляем в него содержимое:
#!/usr/bin/env bash
# Порог по нагрузке (load average за 1 минуту)
MAX_LOAD=4
# Порог по заполнению диска (в процентах) для корневого раздела /
MAX_DISK_USAGE=90
# E-mail для уведомлений (подставь свой)
ALERT_EMAIL="admin@example.com"
# Имя хоста для понятного письма
HOSTNAME=$(hostname)
# Текущая нагрузка (берём целую часть load average из /proc/loadavg)
CURRENT_LOAD=$(awk '{printf "%d", $1}' /proc/loadavg)
# Заполненность диска / в процентах (без символа %)
CURRENT_DISK_USAGE=$(df -P / | awk 'NR==2 {gsub("%","",$5); print $5}')
MESSAGE=""
# Проверка нагрузки
if [ "$CURRENT_LOAD" -ge "$MAX_LOAD" ]; then
MESSAGE+="Высокая нагрузка на сервере ${HOSTNAME}: load=${CURRENT_LOAD} (порог ${MAX_LOAD}).\n"
fi
# Проверка диска
if [ "$CURRENT_DISK_USAGE" -ge "$MAX_DISK_USAGE" ]; then
MESSAGE+="Мало свободного места на диске / на сервере ${HOSTNAME}: занято ${CURRENT_DISK_USAGE}% (порог ${MAX_DISK_USAGE}%).\n"
fi
# Если есть что отправлять — шлём письмо
if [ -n "$MESSAGE" ]; then
echo -e "$MESSAGE" | mail -s "VPS alert: ${HOSTNAME}" "$ALERT_EMAIL"
fi
Сохраняем файл и выходим из редактора.
Примечание: команда mail предполагает, что у вас уже настроен локальный MTA (Postfix/Exim) или используется отдельная статья по отправке почты с сервера. Если почта не настроена — письмо просто никуда не уйдёт.
2. Делаем скрипт исполняемым
sudo chmod +x /usr/local/bin/vps-health-check.sh
3. Проверяем работу вручную
Запускаем скрипт в консоли:
sudo /usr/local/bin/vps-health-check.sh
Если пороги уже превышены — должно уйти письмо. Если всё в норме — скрипт отработает тихо и ничего не выведет.
Запуск скрипта по расписанию через cron
Теперь надо сделать так, чтобы проверки запускались автоматически, например каждые 5 минут.
Вариант 1: через crontab пользователя root
Открываем crontab:
sudo crontab -eВ самый низ добавляем строку:
*/5 * * * * /usr/local/bin/vps-health-check.shЭто значит: запускать скрипт каждые 5 минут от имени root.
Вариант 2: отдельный файл в /etc/cron.d
Если хочется держать всё в отдельном файле, можно сделать так:
echo '*/5 * * * * root /usr/local/bin/vps-health-check.sh' | sudo tee /etc/cron.d/vps-health-check
Совет: если почта настроена правильно, можно в начале «поиграться» с порогами (поставить заведомо низкие значения), чтобы убедиться, что письма приходят, а потом поднять пороги до адекватных.
Как не утонуть в спаме от алертов
Базовый скрипт уже работает, но у любого мониторинга есть оборотная сторона — слишком частые уведомления. Несколько приёмов, которые помогают не сойти с ума.
1. Делать проверку не каждую минуту
Для нагрузки и диска чаще всего достаточно интервала в 5–10 минут. Если сделать запуск каждую минуту, при длительной перегрузке сервера почта просто забьётся.
2. Не ставить слишком низкие пороги
Не стоит слать алерт уже при 60–70% заполнения диска — это рабочий режим.
По нагрузке тоже лучше ориентироваться на «стало плохо и держится», а не на одиночные всплески.
3. Добавить простую «защиту от повторов»
Если захочется усложнить скрипт, можно хранить файл-флаг, что алерт уже отправлялся, и не дёргать почту при каждом запуске. Например, создавать и удалять файлы вида /tmp/vps_alert_highload, но это уже следующий уровень доработки.
Расширяем идею: память, отдельные разделы, Telegram
Тот же подход легко масштабируется:
добавить проверку свободной памяти через
free -mили/proc/meminfo;контролировать не только корневой раздел
/, но и отдельные точки монтирования:/home,/var, раздел под бэкапы;вместо e-mail отправлять уведомления в Telegram через бота (HTTP-запрос в
curlвнутри скрипта).
Логика везде одна и та же: что-то померили → сравнили с порогом → при выходе за пределы отправили одно понятное сообщение.
Итоги
Определились с простыми порогами по нагрузке и заполнению диска для VPS.
Собрали Bash-скрипт, который проверяет
load averageи свободное место и при необходимости отправляет письмо.Подключили cron, чтобы проверки выполнялись автоматически по расписанию.
Разобрали, как избежать бесконечного спама и как расширять скрипт под свои задачи (память, другие разделы, Telegram).
Вывод: базовые алерты по нагрузке и диску можно настроить на любом VPS без сложных систем мониторинга. Один небольшой скрипт и cron уже дают минимум контроля, чтобы узнавать о проблемах до того, как сервер окончательно «ляжет».