Bash скрипты: Сбор и отправка метрик Linux сервера в Telegram

Администрирование виртуального сервера (VPS) под управлением Linux требует постоянного контроля его состояния. Своевременное получение информации о загрузке процессора, потреблении оперативной памяти, свободном месте на диске и сетевой активности помогает предотвратить сбои в работе сервисов и избежать простоев. Постоянный мониторинг через веб-интерфейс панели управления или подключение по SSH не всегда удобен.

В этой статье мы подробно разберем, как автоматизировать процесс мониторинга вашего Linux VPS. Вы научитесь создавать Bash-скрипты для сбора ключевых метрик, настраивать Telegram-бота для получения уведомлений и организовывать автоматическую отправку отчетов по расписанию с помощью планировщика задач Crontab. Это решение легкое, бесплатное и не требует ресурсоемких систем мониторинга.

Данная информация предназначена для услуг: VPS хостинг или Облачный хостинг

Преимущества мониторинга VPS через Telegram

  • Мгновенные уведомления: Получайте критически важные оповещения прямо на свой телефон, где бы вы ни находились.

  • Централизация информации: Все уведомления от разных серверов и сервисов приходят в один чат Telegram, что удобно для анализа.

  • Простота настройки: Не требуется развертывать сложные системы вроде Zabbix или Prometheus. Решение на основе скриптов понятно даже начинающим администраторам.

  • Низкое потребление ресурсов: Bash-скрипты и Crontab практически не нагружают систему, в отличие от тяжелых агентов мониторинга.

  • Доступность: Получать данные о состоянии сервера можно даже без подключения к интернет-панели хостинга или SSH-клиента.

Что будем мониторить: ключевые метрики сервера

Наш скрипт будет собирать и отправлять следующие ключевые показатели производительности:

  1. Загрузка CPU (Центральный процессор): Средняя нагрузка за 1, 5 и 15 минут. Показывает, насколько процессор перегружен задачами.

  2. Использование RAM (Оперативная память): Общий объем, используемая память, свободная память, а также память, используемая кэшем и буферами.

  3. Использование Disk (Дисковое пространство): Занятое и свободное место на критически важных разделах (например, корневой раздел /).

  4. Swap (Файл подкачки): Информация о том, используется ли swap, что может быть признаком нехватки оперативной памяти.

  5. Uptime (Время работы): Как долго сервер работает без перезагрузки.

  6. Подключенные пользователи: Количество пользователей, работающих на сервере в данный момент.

Подготовительный этап: создаем Telegram-бота

Перед написанием скрипта нам необходимо создать канал в Telegram и бота, который будет иметь права на отправку сообщений в этот канал.

Шаг 1: Получаем API-токен бота у @BotFather

  1. Найдите в Telegram пользователя @BotFather.

  2. Отправьте ему команду /start, а затем /newbot.

  3. Следуйте инструкциям: укажите понятное имя бота (например, My VPS Monitor) и его username, который должен оканчиваться на bot (например, my_vps_monitor_bot).

  4. После успешного создания BotFather предоставит вам API-токен. Он выглядит примерно так: 1234567890:AAFmCqW3e4fdsgfdshRlmnOpQStuvWXYZ.

    • ВАЖНО! Этот токен является секретным ключом к вашему боту. Никому его не передавайте.

Шаг 2: Создаем канал и добавляем в него бота

  1. Создайте новый публичный или приватный канал в Telegram. Для примера назовем его VPS Alerts.

  2. Добавьте созданного бота (@my_vps_monitor_bot) в канал в качестве администратора. Дайте ему право на отправку сообщений (Post Messages). Для приватного канала это обязательно.

  3. Для публичного канала достаточно знать его username (например, @vps_alerts_channel). Для приватного канала необходимо получить его Chat ID.

Шаг 3: Получаем Chat ID вашего канала или чата

Самый простой способ получить Chat ID — отправить пробное сообщение в канал через бота.

  1. Откройте браузер и воспользуйтесь следующим URL, подставив ваш API-токен:
    https://api.telegram.org/bot<ВАШ_API_ТОКЕН>/getUpdates
    Например:
    https://api.telegram.org/bot1234567890:AAFmCqW3e4fdsgfdshRlmnOpQStuvWXYZ/getUpdates

  2. Если бот добавлен в канал и имеет права, но сообщений еще не было, ответ будет пустым. Отправьте любое сообщение в канал (например, "Hello").

  3. Обновите страницу в браузере. Вы увидите JSON-ответ, в котором нужно найти блок "chat". Внутри него будет параметр "id". Это отрицательное длинное число (например, -1001234567890) — это и есть Chat ID вашего канала.

    • Сохраните этот ID. Он нам понадобится для скрипта.

Пишем Bash-скрипт для сбора и отправки метрик

Теперь создадим скрипт, который будет собирать системную информацию, форматировать ее в удобочитаемое сообщение и отправлять через API Telegram-бота.

Шаг 1: Создаем и редактируем файл скрипта

Подключитесь к вашему VPS по SSH. Создадим файл скрипта в удобном месте, например, в /opt/scripts/:

sudo mkdir -p /opt/scripts
sudo nano /opt/scripts/vps-monitor.sh

 

Шаг 2: Заполняем скрипт содержимым

Вставьте следующий код в открывшийся редактор, предварительно заменив значения BOT_TOKEN и CHAT_ID на свои.

#!/bin/bash

# ==============================================================================
# КОНФИГУРАЦИЯ
# Замените значения ниже на свои
# ==============================================================================
BOT_TOKEN="1234567890:AAFmCqW3e4fdsgfdshRlmnOpQStuvWXYZ" # Ваш API-токен от @BotFather
CHAT_ID="-1001234567890" # ID вашего канала/чата
HOSTNAME=$(hostname) # Имя сервера (определяется автоматически)
# ==============================================================================

# Функция для отправки сообщения в Telegram
send_telegram_message() {
  local message="$1"
  curl -s -X POST "https://api.telegram.org/bot${BOT_TOKEN}/sendMessage" \
    -d "chat_id=${CHAT_ID}" \
    -d "text=${message}" \
    -d "parse_mode=Markdown" \
    -d "disable_web_page_preview=true" > /dev/null
}

# Сбор системных метрик
# 1. Load Average
LOAD=$(cat /proc/loadavg | awk '{print $1", "$2", "$3}')

# 2. Использование памяти (RAM) и swap
MEMORY_INFO=$(free -hm | awk '/^Mem/ {print "Total: " $2 ", Used: " $3 ", Free: " $4 ", Cache: " $6 "+" $7}')
SWAP_INFO=$(free -hm | awk '/^Swap/ {print "Total: " $2 ", Used: " $3 ", Free: " $4}')

# 3. Использование дискового пространства
# Мониторим корневой раздел (/) и /boot (если есть)
DISK_INFO=$(df -h / /boot --output=source,pcent,avail 2>/dev/null | awk 'NR>1 {print $1 ": " $3 " free, " $2 " used"}')

# 4. Время работы системы
UPTIME=$(uptime | awk -F'( |, |:)+' '{if ($7=="min") printf "%s minutes", $6; else printf "%s days, %s hours, %s minutes", $5, $6, $7}')

# 5. Количество пользователей
USERS=$(who | wc -l)

# 6. Проверка использования swap (фактической активности)
SWAP_USED=$(free | awk '/^Swap/ {if ($2 > 0) print $3/$2 * 100; else print 0}')
SWAP_THRESHOLD=10 # Порог в 10%

# 7. Топ-5 процессов по использованию CPU
TOP_CPU=$(ps -eo pid,user,%cpu,comm --sort=-%cpu | head -n 6 | awk 'NR>1 {print $1 " " $2 " " $3 "% " $4}')

# 8. Топ-5 процессов по использованию RAM
TOP_MEM=$(ps -eo pid,user,%mem,comm --sort=-%mem | head -n 6 | awk 'NR>1 {print $1 " " $2 " " $3 "% " $4}')

# Формирование сообщения
——————————————————————
*???? Load Average:* ${LOAD} (1, 5, 15 min)
*???? Memory:* ${MEMORY_INFO}
*???? Disk:*
${DISK_INFO}
*???? Swap:* ${SWAP_INFO}
*⏰ Uptime:* ${UPTIME}
*???? Users:* ${USERS}

*???? Top CPU Processes (PID USER % COMMAND):*
\`${TOP_CPU}\`
*???? Top MEM Processes (PID USER % COMMAND):*
\`${TOP_MEM}\`
——————————————————————
*???? Date:* $(date +'%Y-%m-%d %H:%M:%S %Z')
"

# Отправка сообщения в Telegram
send_telegram_message "${MESSAGE}"

# Дополнительная проверка: отправим alert, если swap используется больше порога
if (( $(echo "${SWAP_USED} > ${SWAP_THRESHOLD}" | bc -l) )); then
  SWAP_ALERT_MESSAGE="*⚠️ WARNING on ${HOSTNAME}!* Swap usage is high: $(echo ${SWAP_USED} | awk '{printf "%.1f", $1}')%"
  send_telegram_message "${SWAP_ALERT_MESSAGE}"
fi

 

Шаг 3: Делаем скрипт исполняемым и тестируем

Сохраните файл (Ctrl+O, затем Enter в nano) и закройте редактор (Ctrl+X). Дайте файлу права на выполнение:

sudo chmod +x /opt/scripts/vps-monitor.sh

 

Протестируйте скрипт, запустив его вручную:

/opt/scripts/vps-monitor.sh

Если все настроено correctly, через несколько секунд вы получите подробное сообщение о состоянии сервера в ваш Telegram-канал.

Настраиваем автоматизацию с помощью Crontab

Чтобы скрипт запускался автоматически по расписанию, мы используем системный планировщик задач cron.

Вариант 1: Для пользователя root (рекомендуется для системных задач)

Отредактируем crontab для пользователя root:

sudo crontab -e

 

Добавьте в конец файла строку, определяющую расписание. Примеры:

  • Отправка отчета каждые 30 минут:

    */30 * * * * /opt/scripts/vps-monitor.sh

     
  • Отправка отчета каждый день в 9:00 утра:

    0 9 * * * /opt/scripts/vps-monitor.sh

     
  • Комбинированный вариант: отчет каждый час в будни и alert-проверка каждые 5 минут:
    Создадим два скрипта: один для полного отчета (vps-report.sh), другой для краткой проверки (vps-check.sh).
    В crontab:

    # Каждый час с 9 до 19 в будни отправляем полный отчет

    0 9-19 * * 1-5 /opt/scripts/vps-report.sh

    # Каждые 5 минут проверяем критичные метрики (напр., load average и swap)

    */5 * * * * /opt/scripts/vps-check.sh

     

     

Сохраните и закройте файл crontab. Изменения применятся автоматически.

Дополнительные улучшения и идеи

Базовый скрипт можно значительно расширить под свои нужды.

  • Мониторинг отдельных сервисов: Добавьте проверку, запущены ли ключевые сервисы (Nginx, MySQL, PHP-FPM). Если сервис упал, скрипт может отправить критическое оповещение.

    if systemctl is-active --quiet nginx; then
      echo "Nginx is running."
    else
      send_telegram_message "❌ Nginx is DOWN on ${HOSTNAME}!"
    fi

  • Логирование: Перенаправляйте вывод скрипта в файл лога для диагностики ошибок. Добавьте в конец команды в crontab: ... /opt/scripts/vps-monitor.sh >> /var/log/vps-monitor.log 2>&1

  • Безопасность: Для большей безопасности можно вынести BOT_TOKEN и CHAT_ID в отдельный конфигурационный файл с ограниченными правами доступа (например, 600).

  • Пороги для оповещений: Реализуйте более сложные проверки. Например, отправлять alert только если нагрузка CPU превышает 90% более 5 минут подряд.

Регулярно проверяйте работу скрипта и адаптируйте его под изменяющиеся требования вашей инфраструктуры.

  • 0 Пользователи нашли это полезным

Помог ли вам данный ответ?

Ищете что-то другое?

mhost.by