Files
telegram-helper-bot/run_helper.py
Andrey 0b2440e586 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.
2025-08-27 01:17:15 +03:00

92 lines
3.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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__))
if CURRENT_DIR not in sys.path:
sys.path.insert(0, CURRENT_DIR)
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(main())