Files
replicator/run_scheduler.py
2026-03-13 17:11:39 +09:00

68 lines
2.8 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 subprocess
import signal
class ScheduleManager:
def __init__(self, shutdown_timeout=5):
self.process = None
self.running = False
self.shutdown_timeout = shutdown_timeout
def start_schedule(self):
"""Запуск расписания"""
cmd = [
"taskiq", "scheduler",
"app.taskiq.broker:scheduler"
]
print("Запуск расписания...")
self.process = subprocess.Popen(cmd)
self.running = True
# Установить обработчики сигналов
signal.signal(signal.SIGINT, self._signal_handler)
signal.signal(signal.SIGTERM, self._signal_handler)
try:
return_code = self.process.wait()
print(f"Расписание завершилось с кодом: {return_code}")
except KeyboardInterrupt:
print("Получен SIGINT, останавливаем...")
self.stop_schedule()
except Exception as e:
print(f"Ошибка при ожидании расписания: {e}")
self.stop_schedule()
def _signal_handler(self, sig, frame):
"""Обработчик сигнала остановки"""
print(f"\nПолучен сигнал {sig}, останавливаю расприсание...")
self.stop_schedule()
def stop_schedule(self):
"""Корректная остановка расписания"""
if self.process and self.running:
print("Отправляем SIGTERM расприсанию...")
self.process.terminate()
try:
# Ждать завершения в течение self.shutdown_timeout секунд
return_code = self.process.wait(timeout=self.shutdown_timeout)
print(f"Расприсание завершилось с кодом: {return_code}")
except subprocess.TimeoutExpired:
print(f"Расприсание не завершилось за {self.shutdown_timeout} секунд, отправляем SIGKILL...")
self.process.kill()
try:
self.process.wait(timeout=2) # 2 секунды на SIGKILL
print("Процесс принудительно завершен")
except subprocess.TimeoutExpired:
print("Не удалось завершить процесс принудительно")
self.running = False
print("Расприсание остановлено")
def main():
# Использовать короткий таймаут
manager = ScheduleManager(shutdown_timeout=3)
manager.start_schedule()
if __name__ == "__main__":
main()