在整个机器上清理运行结束时的 SIGTERM 信号,不关联的进程(在"Python"/"torch"/"mp"命令行上进行子字符串匹配)
> 相关问题: 没有找到提及 psutil、关键字扫描或跨运行进程杀死的现有问题(搜索: psutil、kill、清理、并行)。## 摘要 `launch_scientist_bfts.py` 中的最终清理首先终止启动器自身的子树(正确),然后对 **计算机上的每个进程** 进行 *额外* 扫描,杀死任何命令行中包含字符串 `"Python"、"torch"、"mp"、"bfts"、"experiment"` 的进程。这会杀死与运行无关的进程 - 最有破坏性的是 *其他并行 AI-Scientist 运行*: 在一个机器上同时运行多个想法时,第一个完成的运行会在半路上杀死所有其他运行。## 位置 `launch_scientist_bfts.py`,当前 `main` 中的行 321-369(96bd516)。有问题的扫描是行 347-359: Python # 附加清理: 查找包含特定关键字的任何孤立进程 keywords = ["Python", "torch", "mp", "bfts", "experiment"] for proc in psutil.process_iter(["name", "cmdline"]): try: # 检查进程名称和命令行参数 cmdline = " ".join(proc.cmdline()).lower() if any(keyword in cmdline for keyword in keywords): proc.send_signal(signal.SIGTERM) proc.wait(timeout=3) if proc.is_running(): proc.kill() except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.TimeoutExpired): continue 特定问题: 1. `psutil.process_iter` 迭代 **所有** 进程,而不是运行的子孙。合法的子清理已经在上面完成(行 326-345 采集 `current_process.children(recursive=True)` 并终止它们),因此此扫描只会在循环中击中 *非子孙*。 2. 字符串匹配非常广泛。 `"Python"` 匹配用户拥有的每个 Python 进程(其他 AI-Scientist 启动、 notebook、编辑器的语言服务器、调度程序)。 `"mp"` 匹配任何命令行包含 `/tmp/`、`mpv`、`compute`、`import` 等的命令行。 3. 扫描匹配启动程序本身(其命令行包含 `Python ... launch_scientist_bfts.py`),因此进程在循环中部分地向自己发送 SIGTERM - 行 369 中的 `sys.exit(0)` 从来没有被触发,运行以信号状态而不是 `0` 退出,这会混淆任何检查退出代码的包装程序。 4. 只有 `AccessDenied` 限制了爆炸半径,使其仅限于同一用户的进程 - 这在实践中对共享工作站或多运行服务器来说是所有重要的事情。## 影响 批量重现期间观察到(在一个机器上同时运行多个想法,每个想法一个 `launch_scientist_bfts.py`):第一个到达清理 SIGTERM 的启动程序杀死了兄弟启动程序及其实验工作者,在树搜索中中途中止它们,没有自己的错误。还观察到启动程序通过项目 3 杀死了自己,从而为原本成功的运行产生非零退出状态。我们不得不消除此块才能运行任何
内容来源: SakanaAI/AI-Scientist-v2