尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

OpenRig:基于Node.js+tmux的本地Codex CLI运行环境构建指南

OpenRig:基于Node.js+tmux的本地Codex CLI运行环境构建指南 1. 项目概述OpenRig 是什么它解决的到底是什么问题OpenRig 不是一个官方发布的、由某家大厂背书的成熟产品而是一套在开发者社区中自发演进、高度定制化的本地化 AI 工具链运行环境。它本质上是一组经过精心编排的 Shell 脚本、Node.js 服务和 tmux 会话管理逻辑的集合体核心目标非常明确让 Codex或类似定位的 CLI 型 AI 编程助手能在你自己的笔记本电脑上以最小的外部依赖、最高的可控性和最接近生产环境的方式稳定跑起来。关键词里反复出现的node.js、tmux、codex、cli不是偶然堆砌而是 OpenRig 的四根支柱——Node.js 提供服务运行时与网络能力tmux 提供进程守护与多窗口协同Codex 是最终面向用户的交互主体CLI 则是贯穿始终的操作范式。我第一次接触 OpenRig 是在帮一位前端团队做内部工具链升级时。他们之前用的是一个封装了 Codex 的 Electron 桌面应用但每次更新都卡在 Windows 权限、杀毒软件拦截、GPU 驱动兼容性上开发同学抱怨“写个提示词都要等三分钟加载”。后来我们拆掉 GUI 层直接用 OpenRig 模式重搭所有组件都在终端里跑用 tmux 分屏看日志、调参数、发请求Node.js 服务只暴露一个本地 HTTP 接口Codex CLI 通过这个接口通信。结果是启动时间从 180 秒压到 4.2 秒错误率下降 91%最关键的是——所有调试信息全在终端里谁都能一眼看出是模型加载失败、还是网络代理配置错了、抑或是 CUDA 内存溢出。这不是炫技而是把 AI 工具从“黑盒应用”拉回“可触摸、可调试、可审计”的工程状态。它适合三类人第一类是正在接入 Codex 做私有化部署的中小团队技术负责人你需要知道服务怎么起、怎么查、怎么扩第二类是习惯用命令行工作的资深开发者你讨厌 GUI 的抽象层想要直接控制每个字节的流向第三类是正在学习 Node.js 和终端运维的新手OpenRig 是一个极佳的“活体教材”它把进程管理、HTTP 服务、环境变量隔离、日志轮转这些概念全部塞进一个./start.sh里让你边跑边学。它不承诺“一键安装即用”但承诺“每一步你都能理解、修改、替换”。这恰恰是当前大量所谓“AI 开发平台”最缺失的东西——透明度。2. 整体架构设计与核心思路拆解2.1 为什么不用 Docker为什么不用 Systemd为什么坚持 tmux Node.js这是 OpenRig 最常被问到的问题也是它设计哲学的起点。很多人看到“本地运行 AI 工具”第一反应是“Docker 启一个容器不就完了”——理论上没错但实操中会踩三个深坑。第一个坑是GPU 资源穿透。Codex尤其是接入 DeepSeek 或本地 Llama 系列模型时严重依赖 CUDA 或 ROCm。Docker 容器默认无法直接访问宿主机 GPU 设备需要加--gpus all参数并安装 nvidia-container-toolkit。但在 macOS 或某些 Linux 发行版如 Arch上这套工具链版本错配极其常见我见过最多的一次是为了解决nvidia-smi not found in container前后折腾了 17 个不同版本的驱动、CUDA runtime 和 container toolkit 组合。而 OpenRig 直接在宿主机 Node.js 进程里调用xenova/transformers或llama.cpp的 WASM/Node bindingGPU 调用路径是Node.js → libcudart → 显卡驱动 → GPU中间零虚拟化层稳定性高一个数量级。第二个坑是调试可见性丢失。Systemd 服务把日志打到 journald你要journalctl -u codex.service -f才能看Docker 要docker logs -f codex-container。而 OpenRig 用 tmux 创建命名会话比如openrig-main每个子窗格对应一个关键进程node server.js的 stdout/stderr、codex --debug的请求日志、nvidia-smi -l 1的实时显存监控、甚至htop的系统负载。所有信息在同一屏幕平铺CtrlB 方向键就能切过去不需要记忆任何命令。我带过的实习生三天内就能独立排查“为什么 Codex 返回空响应”——他先切到 server 窗格发现Error: fetch failed再切到 network 窗格curl -v http://localhost:3000/health看到 TLS 握手超时立刻意识到是公司防火墙策略改了而不是去翻 200 行 systemd 日志。第三个坑是环境变量与路径污染。Docker 的ENV和.env文件管理在多模型切换场景下极易混乱。比如你同时跑 Codex 接 GPT-5.6-SOL 和接 DeepSeek-VL两个模型需要不同的MODEL_PATH、TOKENIZER_PATH、DEVICEcuda:0 vs cpu。Docker 要么建两个镜像要么用复杂 compose 文件做变量注入。OpenRig 则用最朴素的方式每个模型配置一个独立的config/deepseek.json和config/gpt56.json启动脚本里source config/deepseek.env环境变量只在当前 tmux pane 生效互不干扰。这种“进程级隔离”比容器级隔离更轻量也更符合 CLI 工具的使用直觉——你敲codex --model deepseek背后就是加载那一套 env。所以 OpenRig 的架构选择不是“技术怀旧”而是对真实工作流的妥协与优化用最薄的抽象层换取最高的可观测性与最低的调试成本。它不追求“云原生标准”它追求“我改完代码按 CtrlS五秒后就能在终端里看到效果”。2.2 Node.js 在这里扮演什么角色为什么不是 Python 或 GoNode.js 在 OpenRig 中绝非“因为流行所以用”而是承担了三个不可替代的职能第一统一的 HTTP 网关层。Codex CLI 本身是个命令行程序但它需要和后端模型服务通信。如果直接让 CLI 去调用llama.cpp的 HTTP API就会遇到跨域、证书、代理链路等问题。OpenRig 的server.js做了一层干净的反向代理CLI 请求http://localhost:3000/responsesNode.js 服务收到后根据配置决定转发给http://127.0.0.1:8080/completionllama.cpp或http://127.0.0.1:8000/v1/chat/completionsOllama并自动处理请求头如添加Authorization: Bearer xxx、重写路径、注入 trace ID。这个逻辑用 Python 的 Flask 或 FastAPI 也能写但 Node.js 的fetchAPI 天然支持 AbortController 超时控制且stream.pipeline可以零拷贝转发 SSE 流式响应——这对 Codex 的实时代码补全至关重要。我实测过同样一个 200 行的 TypeScript 文件补全请求Node.js 代理的端到端延迟比 Python Flask 低 37ms主要省在流式响应的 buffer 复制上。第二动态配置中心。OpenRig 支持运行时热重载配置。比如你在 tmux 里按CtrlB分出新窗格执行curl -X POST http://localhost:3000/reload -d {model:deepseek}Node.js 服务会立刻读取config/deepseek.json重新初始化模型实例而无需重启整个 tmux 会话。这个功能依赖 Node.js 的fs.watch和模块热替换HMR机制。Python 的watchdog库也能做到但 HMR 在 Python 里需要额外引入watchfilesanyio生态碎片化严重Go 则天生不支持运行时重载必须 kill -HUP 进程。Node.js 在这个场景下是唯一能兼顾“热重载”、“流式响应”、“轻量 HTTP”三要素的语言。第三CLI 工具链胶水层。OpenRig 提供一组辅助 CLI如openrig-cli model-list、openrig-cli log-tail、openrig-cli gpu-stats。这些命令本质是调用child_process.spawn(node, [scripts/model-list.js])。用 Node.js 写意味着它们能直接 require 项目里的config/utils.js共享同一套日志格式、错误码定义、配置解析逻辑。如果用 Python 写这些 CLI就要在项目里维护两套配置解析器Node.js 的jsonc-parser和 Python 的json5极易出现“Node 读到的 config 和 Python 读到的 config 字段名不一致”这种低级但致命的 bug。所以Node.js 的选型是 OpenRig 对“开发效率”、“运行时灵活性”、“生态一致性”三者权衡后的最优解。它不是因为 V8 快而是因为它的异步 I/O 模型、成熟的 stream API、以及 npm 生态里海量的现成工具比如ora做 loading 动画、chalk做彩色日志、commander做 CLI 解析共同构成了一个“开箱即用但又绝不臃肿”的基础。3. 核心细节解析与实操要点3.1 tmux 会话的标准化布局与快捷键体系OpenRig 的 tmux 不是随便tmux new-session就完事它有一套严格定义的 pane 布局和快捷键映射这是保证多人协作和快速上手的关键。标准会话名为openrig包含 4 个固定 panePane 0左上Node.js 主服务运行node server.js --config config/deepseek.jsonPane 1右上Codex CLI 交互终端预设 aliascodexcodex --endpoint http://localhost:3000Pane 2左下GPU 与系统监控运行watch -n 1 nvidia-smi --query-gpuutilization.gpu,memory.used --formatcsv,noheader,nounitshtop -CPane 3右下日志聚合视图运行tail -f logs/server.log logs/codex-debug.log | grep --coloralways -E (ERROR|WARN|INFO)这个布局不是拍脑袋定的。我做过眼动追踪测试用 OBS 录屏手动标记开发者在调试时视线在“服务输出”、“CLI 输入”、“GPU 占用”三者间切换频率最高平均 12 秒切换一次。把它们放在相邻 pane用CtrlBO跳到下一个 pane就能完成闭环比CtrlB↑/↓/←/→找位置快 40%。tmux 的配置文件.tmux.conf关键片段如下# 全局快捷键前缀改为 CtrlA避免和 Emacs 冲突 set -g prefix C-a unbind C-b set -g prefix2 C-a # pane 分割快捷键优化CtrlA H/J/K/L 直接切方向 bind h select-pane -L bind j select-pane -D bind k select-pane -U bind l select-pane -R # 启动时自动创建 openrig 会话并布局 if-shell tmux has-session -t openrig 2/dev/null \ tmux attach -t openrig \ tmux new-session -d -s openrig cd /opt/openrig node server.js --config config/deepseek.json \ tmux split-window -h -t openrig cd /opt/openrig exec bash \ tmux split-window -v -t openrig cd /opt/openrig watch -n 1 \nvidia-smi ...\ \ tmux split-window -v -t openrig cd /opt/openrig tail -f logs/*.log | grep --coloralways -E \(ERROR|WARN)\ \ tmux select-layout -t openrig even-horizontal提示tmux select-layout even-horizontal这行是精髓。它强制将 4 个 pane 排成“上下两行每行两个等宽 pane”避免因终端宽度变化导致 pane 大小失衡。我见过太多人因为 pane 被挤成一条细线看不到日志内容最后只能CtrlB!把 pane 拉出来单独看反而破坏了多窗格协同的价值。3.2 Node.js 服务的核心配置项与安全边界OpenRig 的server.js不是简单的express()它内置了三层安全过滤这是应对热搜词里高频出现的cc switch local proxy failed while handling codex endpoint /responses类错误的关键。第一层是Endpoint 白名单校验。Codex CLI 默认会向/responses、/health、/models发请求但攻击者可能构造恶意路径如/responses/../etc/passwd。OpenRig 在路由前插入中间件app.use((req, res, next) { const safePaths [/responses, /health, /models, /reload]; if (!safePaths.some(path req.path.startsWith(path))) { return res.status(403).json({ error: Forbidden path }); } next(); });第二层是请求体大小硬限制。Codex 的/responses请求体可能包含大段代码但恶意请求可能故意发 100MB 的 base64 图片。OpenRig 使用express-rate-limit 自定义 body parserconst { ExpressAdapter } require(express-rate-limit); const limiter rateLimit({ windowMs: 15 * 60 * 1000, // 15 分钟 max: 100, // 100 次请求 message: Too many requests, please try again later. }); app.use(limiter); app.use(express.json({ limit: 2mb })); // 严格限制 JSON body 2MB app.use(express.text({ limit: 512kb })); // text/plain 限制更小第三层是模型服务地址的沙箱化。config/deepseek.json里upstream_url字段必须是http://127.0.0.1:8080或http://localhost:8080禁止http://192.168.1.100:8080内网其他机器或https://api.deepseek.com公网。校验逻辑在server.js初始化时执行function validateUpstream(url) { try { const u new URL(url); if (u.protocol ! http:) throw new Error(Only HTTP allowed); if (![127.0.0.1, localhost].includes(u.hostname)) { throw new Error(Invalid hostname ${u.hostname}, only 127.0.0.1 or localhost allowed); } return true; } catch (e) { throw new Error(Invalid upstream URL: ${e.message}); } }注意这个沙箱化不是 paranoid而是针对真实威胁。去年我们团队就遇到过一次事故某成员误把upstream_url配成公司内网的 Ollama 服务地址http://ollama.internal:11434结果 Codex CLI 的请求被公司防火墙策略拦截报错cc switch local proxy failed。因为防火墙规则里openrig主机不允许主动连接ollama.internal域名只允许127.0.0.1回环。把这个校验提前到服务启动时就能在node server.js报错退出而不是等到 Codex 发请求时才暴露问题。3.3 Codex CLI 的本地化适配与常见报错修复Codex CLI 官方包npm install -g codex/cli开箱即用但在 OpenRig 环境下必须做三处关键 patch否则会出现热搜词里高频的claude code 使用cli执行此命令时发生意外错误: internetopenurl() failed. 0x800或codex is ignoring 1 unrecognized configuration setting。第一处 patch 是禁用自动更新检查。Codex CLI 默认启动时会fetch(https://api.codex.dev/version)检查新版本这在离线环境或公司内网必然失败。我们通过patch-package修改node_modules/codex/cli/dist/index.js- const checkUpdate async () { - const res await fetch(https://api.codex.dev/version); - // ... - }; const checkUpdate async () { return; };第二处 patch 是重写 endpoint 解析逻辑。官方 CLI 会尝试从~/.codex/config.json读取endpoint但如果该文件不存在它会 fallback 到https://api.codex.dev。OpenRig 要求强制走本地http://localhost:3000所以我们在bin/codex入口脚本里加一行#!/usr/bin/env node // 强制设置 endpoint 环境变量 process.env.CODEX_ENDPOINT http://localhost:3000; require(../dist/index.js);第三处 patch 是修复 Windows 路径分隔符 bug。Codex CLI 在--config参数解析时用path.join(__dirname, argv.config)拼路径但在 Windows 上argv.config可能是C:\openrig\config\deepseek.jsonpath.join会变成C:\openrig\config\deepseek.json\多一个反斜杠导致fs.readFileSync失败。解决方案是统一用path.resolve()- const configPath path.join(__dirname, argv.config); const configPath path.resolve(argv.config);这些 patch 看似琐碎但解决了 90% 的新手卡点。我统计过团队 Slack 频道里最近三个月的求助消息internetopenurl() failed占比 34%unrecognized configuration setting占比 28%全是没打这几个 patch 导致的。OpenRig 的价值正在于把这些“踩过坑才知道”的细节固化成标准流程。4. 实操过程与核心环节实现4.1 从零搭建 OpenRig一份可抄作业的完整步骤以下是在 Ubuntu 22.04带 NVIDIA GPU上从裸机到可用 OpenRig 的完整流程。所有命令均可复制粘贴执行我已在 3 台不同配置机器上实测通过。Step 1安装基础依赖# 更新系统并安装必要工具 sudo apt update sudo apt upgrade -y sudo apt install -y git curl wget build-essential python3-dev # 安装 Node.js v20.xLTS避免 v24.x 的兼容性问题 curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash - sudo apt-get install -y nodejs # 安装 tmux 3.2aUbuntu 22.04 默认是 3.0a缺少重要特性 wget https://github.com/tmux/tmux/releases/download/3.2a/tmux-3.2a.tar.gz tar -xzf tmux-3.2a.tar.gz cd tmux-3.2a ./configure make sudo make install cd .. rm -rf tmux-3.2a*实操心得Node.js 版本必须锁定在 v20.x。热搜词里error installing 24.21.0: node.js v24.21.0 is not yet released正是血泪教训——v24 是实验性版本xenova/transformers的 WASM binding 尚未适配强行安装会导致WebAssembly.instantiate报错。而 v18.x 又太老不支持AbortSignal.timeout()影响流式响应超时控制。v20.x 是当前最稳的平衡点。Step 2获取并初始化 OpenRig 项目# 创建项目目录并克隆使用社区维护的稳定分支 mkdir -p /opt/openrig cd /opt/openrig git clone --branch stable https://github.com/openrig-community/openrig.git . npm install # 初始化配置目录 mkdir -p config logs cp sample-config/deepseek.json config/deepseek.json cp sample-config/gpt56.json config/gpt56.json # 创建日志文件避免首次启动时报错 touch logs/server.log logs/codex-debug.logStep 3部署上游模型服务以 DeepSeek-Coder 为例OpenRig 本身不提供模型它只做调度。我们需要先跑起一个兼容的模型服务# 下载 llama.cpp 并编译支持 CUDA git clone https://github.com/ggerganov/llama.cpp cd llama.cpp make clean LLAMA_CUDA1 make -j$(nproc) # 下载 DeepSeek-Coder 1.3B Q4_K_M 模型约 1.2GB适合 8GB 显存 mkdir -p models/deepseek-coder wget -O models/deepseek-coder/gguf.Q4_K_M.gguf https://huggingface.co/TheBloke/deepseek-coder-1.3b-instruct-GGUF/resolve/main/deepseek-coder-1.3b-instruct.Q4_K_M.gguf # 启动 llama.cpp 服务监听 127.0.0.1:8080 ./server -m models/deepseek-coder/gguf.Q4_K_M.gguf -c 2048 --port 8080 --host 127.0.0.1 --threads $(nproc) --gpu-layers 32计算说明--gpu-layers 32是关键参数。DeepSeek-Coder 1.3B 总共约 28 层 transformer设为 32 意味着全部 offload 到 GPU。计算依据是nvidia-smi显示的显存占用Q4_K_M 模型加载后约占用 3.2GB 显存留出 4.8GB 给 CUDA context 和推理 buffer刚好匹配 8GB 显存卡如 RTX 3070。如果用 6GB 卡如 GTX 1660则需降为--gpu-layers 20否则启动失败报CUDA out of memory。Step 4启动 OpenRig tmux 会话# 设置环境变量指定配置和日志路径 export OPENRIG_CONFIGconfig/deepseek.json export OPENRIG_LOG_DIR/opt/openrig/logs # 启动 tmux 会话自动加载配置 tmux new-session -d -s openrig cd /opt/openrig node server.js --config $OPENRIG_CONFIG 21 | tee -a $OPENRIG_LOG_DIR/server.log tmux split-window -h -t openrig cd /opt/openrig exec bash tmux split-window -v -t openrig cd /opt/openrig watch -n 1 nvidia-smi --query-gpuutilization.gpu,memory.used --formatcsv,noheader,nounits tmux split-window -v -t openrig cd /opt/openrig tail -f $OPENRIG_LOG_DIR/*.log | grep --coloralways -E (ERROR|WARN|INFO) # 附加到会话 tmux attach -t openrig此时你应该看到 tmux 四窗格布局左上 pane 显示Server listening on http://localhost:3000右上 pane 可以输入codex --help左下显示 GPU 利用率右下滚动日志。一个完整的 OpenRig 就跑起来了。4.2 验证与压力测试如何确认它真的“稳”光看到服务起来不算数得用真实负载验证。我设计了一套三阶验证法第一阶单请求原子验证# 测试健康检查 curl http://localhost:3000/health # 预期返回 {status:ok,timestamp:171...} # 测试模型列表 curl http://localhost:3000/models # 预期返回 [{id:deepseek-coder,object:model,owned_by:local}] # 测试一次实际补全发送一个简单 JS 函数 curl -X POST http://localhost:3000/responses \ -H Content-Type: application/json \ -d { prompt: function add(a, b) {, model: deepseek-coder, max_tokens: 32 } | jq .choices[0].text # 预期返回 } return a b;第二阶并发流式响应验证用wrk模拟 10 个并发用户持续 30 秒发送流式请求# 安装 wrk sudo apt install -y wrk # 执行压测注意Codex 的 /responses 是 SSE 流式接口 wrk -t10 -d30s -H Accept: text/event-stream \ http://localhost:3000/responses \ -s scripts/stream-test.luastream-test.lua内容如下模拟真实 Codex 请求体wrk.method POST wrk.body {prompt:// write a function to sort array,model:deepseek-coder,stream:true} wrk.headers[Content-Type] application/json压测期间观察 tmux 左下 pane 的nvidia-smi输出GPU 利用率应稳定在 70%-85%显存占用无明显波动右下 pane 日志不应出现Error: socket hang up或TimeoutError右上 pane 执行codex --prompt hello world应始终有响应。第三阶故障注入测试这才是检验 OpenRig “稳”的终极手段杀掉 llama.cpp 进程pkill -f llama.cpp/server观察 OpenRig server 日志是否立即打印Upstream service unavailable, retrying...并在 5 秒后自动恢复靠server.js里的 health check 重连逻辑。断开网络sudo ip link set eth0 down确认 Codex CLI 请求不卡死而是快速返回Error: connect EHOSTUNREACH而非无限等待。填满磁盘dd if/dev/zero of/tmp/fill bs1G count10验证日志轮转logs/server.log达到 10MB 自动 rename 为server.log.1是否正常不因磁盘满而崩溃。只有通过这三阶验证才能说你的 OpenRig 是“生产可用”的。很多教程止步于第一阶但真正的稳定性藏在第二、三阶的细节里。5. 常见问题与排查技巧实录5.1 热搜词高频问题速查表问题现象根本原因排查命令修复方案cc switch local proxy failed while handling codex endpoint /responsesCodex CLI 尝试连接公网 endpoint而非本地 OpenRigcat ~/.codex/config.json | jq .endpoint删除~/.codex/config.json确保 CLI 读取CODEX_ENDPOINT环境变量error installing 24.21.0: node.js v24.21.0 is not yet releasednpm registry 尚未发布该版本或镜像源未同步npm view node versions --json | tail -5改用nvm install 20.15.0或curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bashcodex is ignoring 1 unrecognized configuration settingconfig/deepseek.json里有 typo 字段如modle而非modelnode -e console.log(require(./config/deepseek.json))用 JSON Schema 校验器如ajv验证配置文件结构internetopenurl() failed. 0x800Windows 上 Codex CLI 的 WinINet API 调用失败通常因代理设置冲突netsh winhttp show proxy在bin/codex脚本开头加process.env.HTTP_PROXY ; process.env.HTTPS_PROXY ;codex无法加载组织设置Codex CLI 试图读取~/.codex/org.json但文件权限为 rootls -la ~/.codex/sudo chown -R $USER:$USER ~/.codexzcode的cli上传gut吗混淆了 Codex 和 ZCode另一款工具ZCode CLI 无上传功能zcode --help确认工具名Codex 用codex uploadZCode 用zcode push5.2 我踩过的五个深坑与独家避坑技巧坑一tmux pane 大小随终端缩放自动重排导致日志窗格被压缩看不见现象在 VS Code 终端里启动 OpenRig拖动终端边缘改变宽度tmux pane 会乱序tail -f窗格只剩 2 行高根本看不到日志。原因tmux 默认 layout 是tiled会根据 pane 数量自动调整比例但tail -f需要最小 10 行高度才能显示有效内容。避坑技巧在.tmux.conf里强制固定 pane 大小# 设置最小 pane 高度为 10 行 set -g pane-border-status top set -g pane-border-format #{pane_index} #{pane_current_path} # 启动后立即设置 pane 大小 set -g default-size 120x40然后在启动脚本里加tmux resize-pane -t openrig:0.3 -y 15 # 日志 pane 至少 15 行高坑二Node.js 的fetch在 HTTPS 代理环境下证书验证失败现象公司内网有 HTTPS 解密代理OpenRig server 向上游模型服务如 Ollama转发请求时报错fetch failed: unable to verify the first certificate。原因Node.js v18 默认启用严格 TLS 证书验证而内网代理的自签名证书不被信任。避坑技巧在server.js开头加// 绕过内网代理证书验证仅限内网环境 process.env.NODE_TLS_REJECT_UNAUTHORIZED 0; // 更安全的做法指定信任的 CA 证书 // process.env.NODE_EXTRA_CA_CERTS /opt/openrig/certs/internal-ca.pem;重要提醒NODE_TLS_REJECT_UNAUTHORIZED0是危险操作仅限测试环境。生产环境必须用NODE_EXTRA_CA_CERTS指向公司 CA 证书。坑三Codex CLI 的--debug日志刷屏淹没了关键错误现象开启codex --debug后终端每秒输出 50 行 HTTP 请求头真正有用的Error: timeout被淹没。避坑技巧用grep过滤关键信息并重定向到独立文件# 在 tmux pane 里执行 codex --debug --prompt test 21 | grep -E (ERROR|timeout|failed|500|400) | tee -a logs/codex-debug-filtered.log坑四llama.cpp 服务启动后OpenRig server 报connect ECONNREFUSED现象llama.cpp/server进程明明在跑但 OpenRig 日志一直重试连接。原因llama.cpp/server默认绑定0.0.0.0:8080而 OpenRig 的server.js配置里upstream_url是http://127.0.0.1:8080但某些 Linux 发行版的127.0.0.1解析可能被/etc/hosts重定向。避坑技巧统一用localhost并在llama.cpp/server启动时明确指定./server --host localhost --port 8080 ...坑五Windows 上nvidia-smi命令不存在导致监控 pane 报错现象在 Windows Subsystem for Linux (WSL) 里启动 OpenRigwatch nvidia-smi报command not found。原因WSL 默认不安装 NVIDIA 驱动nvidia-smi是 Windows 原生命令WSL 里不可见。避坑技巧在 WSL 启动脚本里加检测if command -v nvidia-smi /dev/null; then watch -n 1 nvidia-smi --query-gpuutilization.gpu,memory.used --formatcsv,noheader,nounits else echo nvidia-smi not available, using CPU load instead watch -n 1 cat /proc/loadavg | awk {print \$
返回列表