坑5 SSH 断连杀进程,把 Codex 的 Base URL 改到 TaoToken 后让它排查
1. 坑5 现场还原SSH 一断run_eval.py 连人带结果一起消失如果你正在 Windows 工作站上跑本地代码大模型评测用 llama.cpp 做推理后端、自己写 Python 脚本跑 humaneval 这类数据集那这篇大概率能帮你省下一天甚至几十个小时。核心检索词就三个本地代码大模型、评测、SSH 断连杀进程。坑5 的现象非常具体——你通过 SSH 连到 Windows 工作站敲下python run_eval.py看着日志一行行滚然后你关掉 SSH 窗口去吃饭回来发现进程没了跑了几个小时的评测结果瞬间丢失连日志都没留下。这个坑的根因在 Windows 的 sshdOpenSSH Server行为上。当 SSH 客户端断开时Windows 的 sshd 会连带杀掉所有关联的子进程而不是像 Linux 那样只发一个 SIGHUP 让你有机会用 nohup、tmux、screen 接管。Windows 上这些工具要么没有要么行为不可靠。我第一次遇到时以为是脚本崩了查了半天事件日志才反应过来是 SSH 会话生命周期的问题。这篇的排障思路是先把 Codex 接上 TaoToken让 Codex 对照这台 Windows 工作站的实际情况生成一套可靠的进程托管方式桌面 session bat tee 日志并解释为什么 PowerShell ScheduledJob 和 NSSM 在这里不靠谱。配好后先让 Codex 跑通一条“分析 sshd 断开日志”的请求验证 Key 和通道可用。需要说清楚的是TaoToken 不替代评测脚本或 llama.cpp它只负责为 Codex 提供模型 Key 与兼容 API 地址。拿到 Key 后Codex 还能继续帮你排查思维循环、mmap 双映射等其余 7 个坑。2. 前置给 Codex 接上 TaoToken 的 Key 与 Base URL在让 Codex 帮你分析 sshd 日志之前得先让它能正常调用模型。这一步不复杂但顺序别搞反先拿 Key再改 Base URL最后验证通道。打开 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 注册账号进入控制台创建 API Key。创建时建议给 Key 起个能认出来的名字比如codex-win-eval方便后面在多个项目里区分。Key 只在创建时完整显示一次复制后先存到安全的地方。拿到 Key 之后把 Codex 的 Base URL 填成https://taotoken.net/api。注意这里用的是 API 地址不带任何查询参数。Codex 这类工具通常支持通过环境变量或配置文件指定 Base URL 和 API Key两种方式我都试过环境变量更适合临时切换配置文件更适合长期使用。如果你用的是 Claude Code 这类 Anthropic 兼容的编码工具接入文档里有对应的配置说明地址是 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。模型对话入口在 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite API Keys 管理在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 。长期做编码和 Agent 任务的话Coding Plan 在 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。这里要强调一点TaoToken 的角色是提供模型 Key 和兼容 API 地址它不替代你的评测脚本也不替代 llama.cpp 推理后端。你的run_eval.py该怎么跑还怎么跑Codex 只是帮你分析和生成托管方案的工具。3. 可复制配置桌面 session bat tee 日志的完整落地坑5 的解决思路其实很朴素让评测进程跑在 Windows 桌面 session 里而不是 SSH 会话的子进程里。具体做法是写一个 bat 文件双击运行然后你可以放心关掉远程桌面或 SSH 窗口进程会继续跑。先看 bat 文件的内容。假设你的评测脚本在C:\eval\run_eval.py模型是 qwen3.6-27b数据集是 humanevalecho off cd /d C:\eval set PYTHONIOENCODINGutf-8 set PYTHONUTF81 python run_eval.py --model qwen3.6-27b --dataset humaneval --resume 21 | tee eval.log pause这里有几个细节值得展开。cd /d确保工作目录正确避免相对路径找不到模型或数据集。PYTHONIOENCODINGutf-8和PYTHONUTF81是为了绕开 Windows 默认 GBK 编码带来的坑6这个后面排障章节会细说。21 | tee eval.log把 stdout 和 stderr 都重定向到日志文件同时还在控制台显示方便你实时看进度。--resume是断点续传参数配合脚本里的 checkpoint 机制使用。双击这个 bat 文件后评测进程就挂在桌面 session 下了。你可以关掉 SSH 窗口甚至断开远程桌面进程都不会死。需要远程监控的时候SSH 连上去tail -f C:\eval\eval.log就行但记住监控可以走 SSH启动必须在桌面 session。为什么 PowerShell ScheduledJob 和 NSSM 在这里不靠谱我实测下来的结论是ScheduledJob 在非交互式 session 里跑时HuggingFace 的 datasets 库会卡住原因不明日志里也看不出所以然。NSSM 把 Python 脚本注册成 Windows 服务听起来很美但服务 session 和桌面 session 的环境差异会导致 CUDA 初始化失败或显存分配异常。至于在 bat 里用start /b它只是把进程放到后台父进程一退还是会被带走。最可靠的方案就是最原始的方案桌面 session 里双击 bat。如果你想让 Codex 帮你生成这套配置可以直接把工作站情况描述给它Windows 版本、Python 路径、评测脚本位置、llama.cpp 启动方式让它输出适配你环境的 bat 和目录结构。Codex 在这里的价值是帮你把散落的路径和环境变量整理成可复制的脚本而不是替你跑评测。4. 验证请求让 Codex 分析 sshd 断开日志确认通道可用配置改完后别急着跑完整评测先用一条小请求验证 Key 和通道是否可用。我一般会让 Codex 做一件和当前排障直接相关的事分析 sshd 断开日志。Windows 的 OpenSSH 日志通常在事件查看器里路径是“应用程序和服务日志 OpenSSH Operational”。你也可以用 PowerShell 导出Get-WinEvent -LogName OpenSSH/Operational -MaxEvents 50 | Select-Object TimeCreated, Id, Message | Format-List | Out-File -Encoding utf8 sshd_log.txt然后把sshd_log.txt的内容贴给 Codex让它分析哪些事件对应 SSH 会话断开、断开时是否有子进程被终止的记录。这一步既验证了 TaoToken 通道可用又直接服务于坑5 的排障。如果你更想先验证模型对话本身是否通可以走模型对话入口 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 发一条简单的“解释 Windows sshd 断开时子进程生命周期”的请求看返回是否正常。通道验证通过后再回到 Codex 里做具体的日志分析。验证成功的标志很简单Codex 能正常返回内容且返回内容里引用了你贴给它的日志片段。如果返回超时或报 401先检查 Key 是否复制完整、Base URL 是否写成了https://taotoken.net/api而不是别的路径。5. 本篇常见错排查从 401 到进程仍然被杀排障视角下坑5 相关的错误可以分成两类接入层错误和托管层错误。接入层最常见的是 401 Unauthorized。原因通常是 Key 没复制完整、Key 被禁用、或者 Base URL 写错了。检查顺序是先确认 Base URL 是https://taotoken.net/api再确认 Key 没有多余空格最后去控制台看 Key 状态。如果用的是环境变量注意 Windows 下set和setx的区别set只在当前窗口生效。另一个接入层错误是模型名不匹配。Codex 里填的模型名要和 TaoToken 支持的模型列表一致填错了会返回 404 或 model not found。模型列表在模型对话页面能看到。托管层最常见的错误是“明明用了 bat进程还是被杀”。这种情况通常是 bat 被 SSH 会话间接启动了比如你 SSH 进去后敲了cmd /c start_eval.bat那 bat 仍然是 SSH 会话的子进程。正确做法是通过远程桌面连上去在桌面里双击 bat或者用计划任务但触发方式选“用户登录时”而不是“系统启动时”。还有一个隐蔽的坑tee在 Windows 原生 cmd 里不存在。如果你直接双击 bat 报tee 不是内部或外部命令说明系统 PATH 里没有 tee。解决方案是用 Git Bash 自带的 tee或者把 bat 改成用 PowerShell 的Tee-Objectecho off cd /d C:\eval set PYTHONIOENCODINGutf-8 powershell -Command python run_eval.py --model qwen3.6-27b --dataset humaneval --resume 21 | Tee-Object -FilePath eval.log pause日志文件写不进去也是常见问题。检查C:\eval目录是否有写权限以及 eval.log 是否被其他进程占用。如果日志里出现 GBK 编码错误参考坑6 的解法在 Python 文件操作里显式指定encodingutf-8。6. 语义一致 CTA排障继续Key 和文档在这里坑5 解决后Codex 还能继续帮你排查思维循环、mmap 双映射、DRY 采样器、reasoning-budget、GBK 编码、PrismML ABI、CUDA 版本这些坑。每个坑的排障思路都一样先把现象和日志喂给 Codex让它对照你的工作站环境给出可复制的命令和配置。如果你在接入或排障过程中遇到 Key 相关问题直接去 API Keys 管理页 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 检查 Key 状态。接入配置的细节在接入文档 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。需要验证模型是否正常响应走模型对话 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 。长期跑编码和 Agent 任务Coding Plan 在 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。最后说一个我踩过的坑bat 文件里的pause在无人值守场景下会卡住进程。如果你希望评测跑完后自动退出把pause去掉改成在脚本里写完成标记。另外日志文件建议按日期分目录存放比如C:\eval\logs\2025-01-15\eval.log这样崩溃恢复时能快速定位到最近一次运行的日志不用在一堆同名文件里翻。