diff --git a/src/daemon/ticker.py b/src/daemon/ticker.py index d8e927c..8c526c5 100644 --- a/src/daemon/ticker.py +++ b/src/daemon/ticker.py @@ -20,6 +20,7 @@ from typing import Any, Callable, Coroutine, Dict, List, Optional from src.blackboard.operations import Blackboard from src.blackboard.db import get_connection from src.blackboard.models import Task +from src.daemon.spawner import AgentBusyError from src.blackboard.queries import Queries from src.blackboard.registry import ProjectRegistry @@ -864,6 +865,18 @@ class Ticker: except (ValueError, TypeError): pass + # v2.7.2: 进程存活性检查 — counter 占用但进程已死的光底 + if self.spawner and self.counter: + for agent_id in list(self.counter.active_agents.keys()): + session_info = self.spawner.get_session_by_agent(agent_id) + if not session_info: + continue + pid = session_info.get("pid") + if pid and not self._is_pid_alive(pid): + logger.warning("Agent %s process dead (pid=%d), releasing counter", + agent_id, pid) + self.counter.release(agent_id) + return reclaimed def _mail_check_reply(self, original_task_id: str, db_path: Path) -> bool: