Содержание:
Что умеет скрипт
Баш-скрипт будет запускаться systemd-сервисом каждые 10 секунд или с другим интервалом по вашему выбору. Может чекать кастомные порты. Минималистичный, лаконичный, не нагружает систему.
- Nginx процесс
- Apache процесс
- Порт 80 и другие по желанию
2. PHP
- PHP-FPM
3. Базы данных
- MariaDB
- MySQL
Создаем телеграм бота
Botfather – официальный бот телеграм. Через него создаются и редактируются не только боты, но и миниапы.
1. Найдите @BotFather в Telegram
2. Отправьте команду ‘/newbot’
3. Следуйте инструкциям
4. Сохраните полученный токен
5. Напишите любое сообщение вашему боту
Получите ваш ID чата:
1. Найдите @userinfobot в Telegram
2. Отправьте любое сообщение
3. Сохраните полученный ID
Создаем bash скрипт
Создаем файл скрипта:
sudo nano /usr/local/bin/service-monitor.sh
Вставляем в него данный код. Заменяем токен бота и токен чата из раздела СОЗДАЕМ БОТА. По желанию добавляем свои кастомные порты, если есть:
#!/bin/bash
# Конфигурация Telegram бота
TELEGRAM_BOT_TOKEN="YOUR_BOT_TOKEN"
TELEGRAM_CHAT_ID="YOUR_CHAT_ID"
# Список портов для проверки (стандартные и кастомные)
PORTS_TO_CHECK="80" # Добавьте свои порты через запятую, например: "80 веб сервер, 3306 внешняя mysql"
# Отправка сообщения в Telegram
send_telegram_message() {
local message="$1"
curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage" \
-d chat_id="${TELEGRAM_CHAT_ID}" \
-d text="${message}" \
-d parse_mode="HTML"
}
# Проверка статуса сервиса
check_service() {
local service=$1
local status
# Проверка через systemd
if command -v systemctl >/dev/null 2>&1; then
if systemctl is-active --quiet $service; then
status="active"
else
status=$(systemctl status $service 2>/dev/null | grep 'Active:' | awk '{print $2}')
fi
# Проверка через service
elif command -v service >/dev/null 2>&1; then
if service $service status >/dev/null 2>&1; then
status="active"
else
status="inactive"
fi
# Проверка через process
else
if pgrep -f "$service" >/dev/null; then
status="active"
else
status="inactive"
fi
fi
# Отправляем уведомление если сервис не активен
if [ "$status" != "active" ] && [ "$status" != "running" ]; then
send_telegram_message "❌ Сервис $service не работает (статус: $status) на сервере $(hostname)"
fi
}
# Проверка порта
check_port() {
local port=$1
if ! ss -tuln | grep ":$port " >/dev/null 2>&1; then
if ! netstat -tuln | grep ":$port " >/dev/null 2>&1; then
send_telegram_message "❌ Порт $port не прослушивается на сервере $(hostname)"
fi
fi
}
# Проверка установленных веб-серверов
[ -f /usr/sbin/nginx ] || command -v nginx >/dev/null 2>&1 && check_service nginx
[ -f /usr/sbin/apache2 ] || command -v apache2 >/dev/null 2>&1 && check_service apache2
[ -f /usr/sbin/httpd ] || command -v httpd >/dev/null 2>&1 && check_service httpd
# Проверка MySQL/MariaDB
[ -f /usr/sbin/mysqld ] || command -v mysql >/dev/null 2>&1 && {
check_service mysql
check_service mysqld
}
# Проверка всех версий PHP-FPM
if [ -d /etc/php ]; then
for phpver in /etc/php/*; do
if [ -d "$phpver/fpm" ]; then
check_service "php$(basename $phpver)-fpm"
fi
done
fi
# Дополнительная проверка php-fpm
command -v php-fpm >/dev/null 2>&1 && check_service php-fpm
# Проверка всех указанных портов
for port in ${PORTS_TO_CHECK//,/ }; do
check_port $port
done
Далее даем этому файлу привелегии запуска:
sudo chmod +x /usr/local/bin/service-monitor.sh
Создание systemd сервиса
Создаем новый файл сервиса:
sudo nano /etc/systemd/system/service-monitor.service
Вставляем в него следующий код, RestartSec=10 – это преодичность работы чекера в секундах, можете поставить 60:
[Unit]
Description=Service Monitor Daemon
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/service-monitor.sh
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
Далее активируем созданный сервис:
sudo systemctl daemon-reload
sudo systemctl enable service-monitor
sudo systemctl start service-monitor
Для проверки чекера достаточно ввести:
sudo service nginx stop
Подождать заданный тайминг и проверить сообщения телеграм.
Как только получили алерт, запускаем обратно остановленный nginx:
sudo service nginx start
Управление
Статус:
sudo systemctl status service-monitor
Запуск:
sudo systemctl start service-monitor
Остановка:
sudo systemctl stop service-monitor
Перезапуск:
sudo systemctl restart service-monitor