启动评审器会终止占用目标端口的任何进程
原文依据:3 处评审器在绑定默认端口前运行 `lsof -ti :<port>`,并对返回的每个 PID 发送 SIGTERM;它不检查该进程是否属于本 Skill。
如果端口 3117 已被开发服务器、数据库代理或其他工作占用,该进程会被意外停止,造成会话中断或未保存状态丢失。
启动非静态评审器时,它会先查找目标端口上的所有监听进程,并向每个 PID 发送 SIGTERM,没有确认进程归属。默认端口 3117 若正被其他本机应用使用,该应用可能被意外终止并丢失未保存工作。用户可改用 `--static`,或要求作者直接尝试空闲端口而不杀进程。
def _kill_port(port: int) -> None: """Kill any process listening on the given port.""" try: result = subprocess.run( ["lsof", "-ti", f":{port}"], capture_output=True, text=True, timeout=5, ) for pid_str in result.stdout.strip().split("\n"): if pid_str.strip(): try: os.kill(int(pid_str.strip()), signal.SIGTERM) except (ProcessLookupError, ValueError): pass if result.stdout.strip(): time.sleep(0.5) except subprocess.TimeoutExpired:查看另外 2 个位置
def main() -> None: parser = argparse.ArgumentParser(description="Generate and serve eval review") parser.add_argument("workspace", type=Path, help="Path to workspace directory") parser.add_argument("--port", "-p", type=int, default=3117, help="Server port (default: 3117)") parser.add_argument("--skill-name", "-n", type=str, default=None, help="Skill name for header") parser.add_argument( # Kill any existing process on the target port port = args.port _kill_port(port) handler = partial(ReviewHandler, workspace, skill_name, feedback_path, previous, benchmark_path)