#!/usr/bin/env python3 """ run_scheduler.py — momo-scheduler 容器入口點 排程任務清單(對齊 app.py init_scheduler + scheduler.py 全任務): 每 30 分鐘:auto_import、whitepage_check 每 1 小時:momo、edm、festival 每 4 小時:competitor_price_feeder、icaim_analysis 每 6 小時:openclaw_meta_analysis、quality_rescore 每 12 小時:dedup_batch 每 1 天 :db_backup、backup_monitor 每 1 週 :weekly_strategy(週一 06:00) """ import asyncio import logging import threading import time import schedule # 匯入全部排程任務函式 from scheduler import ( run_momo_task, run_edm_task, run_festival_task, run_auto_import_task, run_whitepage_check, run_competitor_price_feeder_task, run_icaim_analysis_task, run_weekly_strategy_task, run_db_backup_task, run_backup_monitor_task, run_openclaw_meta_analysis_task, run_dedup_batch_task, run_quality_rescore_task, ) logging.basicConfig( level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', ) logger = logging.getLogger(__name__) def _register_schedules(): schedule.every(30).minutes.do(run_auto_import_task) logger.info("📅 每 30 分鐘:auto_import") schedule.every(30).minutes.do(run_whitepage_check) logger.info("📅 每 30 分鐘:whitepage_check") schedule.every(1).hours.do(run_momo_task) logger.info("📅 每 1 小時:momo_task") schedule.every(1).hours.do(run_edm_task) logger.info("📅 每 1 小時:edm_task") schedule.every(1).hours.do(run_festival_task) logger.info("📅 每 1 小時:festival_task") schedule.every(4).hours.do(run_competitor_price_feeder_task) logger.info("📅 每 4 小時:competitor_price_feeder") schedule.every(4).hours.do(run_icaim_analysis_task) logger.info("📅 每 4 小時:icaim_analysis") schedule.every(6).hours.do(run_openclaw_meta_analysis_task) logger.info("📅 每 6 小時:openclaw_meta_analysis") schedule.every(6).hours.do(run_quality_rescore_task) logger.info("📅 每 6 小時:quality_rescore") schedule.every(12).hours.do(run_dedup_batch_task) logger.info("📅 每 12 小時:dedup_batch") schedule.every().day.at("03:00").do(run_db_backup_task) logger.info("📅 每日 03:00:db_backup") schedule.every().day.at("04:00").do(run_backup_monitor_task) logger.info("📅 每日 04:00:backup_monitor") schedule.every().monday.at("06:00").do(run_weekly_strategy_task) logger.info("📅 每週一 06:00:weekly_strategy") def _run_elephant_alpha_engine(): """Daemon thread: ElephantAlpha 自主監控引擎(獨立 asyncio loop)""" try: from services.elephant_alpha_autonomous_engine import autonomous_engine loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) logger.info("🐘 [ElephantAlpha] Autonomous engine thread started") loop.run_until_complete(autonomous_engine.start_autonomous_monitoring()) except Exception as e: logger.error(f"🐘 [ElephantAlpha] Engine crashed: {e}") finally: loop.close() if __name__ == "__main__": logger.info("🚀 momo-scheduler 啟動中...") _register_schedules() logger.info("✅ 全部排程任務已註冊") _ea_thread = threading.Thread( target=_run_elephant_alpha_engine, daemon=True, name="elephant-alpha-engine", ) _ea_thread.start() logger.info("🐘 [ElephantAlpha] Autonomous engine thread launched") logger.info("⏰ 排程主迴圈啟動,等待任務觸發...") while True: try: schedule.run_pending() time.sleep(1) except KeyboardInterrupt: logger.info("⛔ Scheduler stopped.") break except Exception as e: logger.error(f"Scheduler error: {e}") time.sleep(5)