diff --git a/scripts/cron_health_monitor.py b/scripts/cron_health_monitor.py index 057588c2..501ee28d 100644 --- a/scripts/cron_health_monitor.py +++ b/scripts/cron_health_monitor.py @@ -44,8 +44,24 @@ def xmpp_push(text): print(f"[XMPP推送失败] {e}", file=sys.stderr) return False + +def _create_cron_todo(tname, desc): + """为故障cron创建TODO供自愈处理""" + try: + _c = __import__('sqlite3').connect("/home/hmo/MoFin/data/mofin.db", timeout=10) + _c.execute( + "INSERT OR REPLACE INTO todos (id, title, description, status, priority, source, fix_action, created_at) " + "VALUES (?, ?, ?, 'pending', 'high', 'cron_health', ?, datetime('now','localtime'))", + (f"cron_err_{tname.replace(' ','_')}", f"[CRON_ERROR] {tname}", desc, + f"cd /home/hmo/MoFin && python3 scripts/preflight_verify.py --cron-check") + ) + _c.commit() + _c.close() + except Exception: + pass + + def parse_time(ts_str): - """解析ISO时间戳为datetime""" if not ts_str: return None try: @@ -147,6 +163,8 @@ def main(): if is_new_alert(key, state): alerts.append(f"❌ {j['name']}({j['id'][:8]}) [{tag}] {j['status']} @ {j['last_run'][:19]}") state[key] = {"last_alerted": datetime.now().timestamp()} + # 同时写TODO供自愈系统处理 + _create_cron_todo(j['name'], f"[CRON_ERROR] {j['name']} 状态={j['status']} 最后运行={j['last_run'][:19]}") # ── 检查2:关键job空闲超时 ── stale_jobs = check_idle(jobs)