Add server monitoring functionality and update Makefile and requirements

- Introduced a new server monitoring module in `run_helper.py` with graceful shutdown handling.
- Updated `.gitignore` to include PID files.
- Added `test-monitor` target in `Makefile` for testing the server monitoring module.
- Included `psutil` in `requirements.txt` for system monitoring capabilities.
This commit is contained in:
2025-08-27 01:17:15 +03:00
parent 9688cdd85f
commit 0b2440e586
7 changed files with 629 additions and 2 deletions

View File

@@ -1,6 +1,7 @@
import asyncio
import os
import sys
import signal
# Ensure project root is on sys.path for module resolution
CURRENT_DIR = os.path.dirname(os.path.abspath(__file__))
@@ -9,6 +10,82 @@ if CURRENT_DIR not in sys.path:
from helper_bot.main import start_bot
from helper_bot.utils.base_dependency_factory import get_global_instance
from helper_bot.server_monitor import ServerMonitor
async def start_monitoring(bdf, bot):
"""Запуск модуля мониторинга сервера"""
monitor = ServerMonitor(
bot=bot,
group_for_logs=bdf.settings['Telegram']['group_for_logs'],
important_logs=bdf.settings['Telegram']['important_logs']
)
return monitor
async def main():
"""Основная функция запуска"""
bdf = get_global_instance()
# Создаем бота для мониторинга
from aiogram import Bot
from aiogram.client.default import DefaultBotProperties
monitor_bot = Bot(
token=bdf.settings['Telegram']['bot_token'],
default=DefaultBotProperties(parse_mode='HTML'),
timeout=30.0
)
# Создаем экземпляр монитора
monitor = await start_monitoring(bdf, monitor_bot)
# Флаг для корректного завершения
shutdown_event = asyncio.Event()
def signal_handler(signum, frame):
"""Обработчик сигналов для корректного завершения"""
print(f"\nПолучен сигнал {signum}, завершаем работу...")
shutdown_event.set()
# Регистрируем обработчики сигналов
signal.signal(signal.SIGINT, signal_handler)
signal.signal(signal.SIGTERM, signal_handler)
# Запускаем бота и мониторинг
bot_task = asyncio.create_task(start_bot(bdf))
monitor_task = asyncio.create_task(monitor.monitor_loop())
try:
# Ждем сигнала завершения
await shutdown_event.wait()
print("Начинаем корректное завершение...")
except KeyboardInterrupt:
print("Получен сигнал завершения...")
finally:
print("Отправляем сообщение об отключении...")
try:
# Отправляем сообщение об отключении
await monitor.send_shutdown_message()
except Exception as e:
print(f"Ошибка при отправке сообщения об отключении: {e}")
print("Останавливаем задачи...")
# Отменяем задачи
bot_task.cancel()
monitor_task.cancel()
# Ждем завершения задач
try:
await asyncio.gather(bot_task, monitor_task, return_exceptions=True)
except Exception as e:
print(f"Ошибка при остановке задач: {e}")
# Закрываем сессию бота
await monitor_bot.session.close()
print("Бот корректно остановлен")
if __name__ == '__main__':
asyncio.run(start_bot(get_global_instance()))
asyncio.run(main())