codex exec 卡住:先保存 JSONL,再改配置
两次 Codex CLI 0.157.0 运行记录说明:耗时和 warning event 不能单独定位非交互任务的卡点。
最近更新: 2026-10-02
作者 Stometa · 核验依据与日期见正文中的来源和运行记录。
2026 年 10 月 2 日,Codex CLI 0.157.0 用 22.38 秒完成了一个两行文件计数任务。9 月 30 日的相近任务超过 120 秒,但当时的控制程序丢弃了输出。先保留 JSONL,再决定是否改模型或超时设置。 9 月的记录无法定位卡点;10 月的记录能确认 turn 完成、文件读取成功。一次成功不能解释此前的超时。
代价:本地 trace 可能包含任务文本和工具输出。先私下保存、检查和脱敏。下表是公开的第一方记录摘要;原始 stdout 和 stderr 留在仓库之外。
两次运行各证明了什么?
两次都在临时 Git 仓库里执行,sample.txt 都有两行。留存的 10 月控制程序证明这两行是 alpha 和 beta;9 月摘要没有保留文件的准确内容。命令都是只读、ephemeral 的 codex exec --json。9 月的控制程序没有保留中途输出,也没有记录 stdin 如何处理。10 月控制程序将 stdin 设为 DEVNULL,分别保存 stdout 和 stderr。继承的配置与服务状态没有做严格配对。
| 运行 | 控制条件与留存 | 观察结果 | 仍未知 |
|---|---|---|---|
| 9 月 30 日,CLI 0.157.0 | 120 秒上限;中途输出丢失;stdin 未记录 | 控制程序超时 | 最后一个 Codex event、工具是否执行、延迟原因 |
| 10 月 2 日,CLI 0.157.0 | 120 秒上限;关闭 stdin;分别保存 JSONL 和 stderr | 22.38 秒退出,exit 0、turn.completed,文件命令输出 2 | stdin、provider 时延或其他条件中,哪项造成差异 |
10 月 trace 先出现 thread.started,随后有两个带配置 warning 的 item.completed,再出现 turn.started、成功读取文件的命令,以及 turn.completed。本次 warning 没有阻止任务完成。如果脚本把每个 item.completed error item 都判为任务失败,就会误判这次运行。应先看 turn 结局和进程退出码,再单独处理 warning。
超时时怎样留下 trace?
OpenAI 官方非交互模式文档在 10 月 2 日核对:--json 把 JSON Lines event 写到 stdout,包含 thread.started、turn.started、turn.completed、turn.failed、item.* 和 error。不用 --json 时,进度写到 stderr,最终消息写到 stdout。文档还说明:命令已有 prompt 参数时,管道输入的 stdin 会被当作附加上下文。stdin 因此必须记录,但这并未证明它是 9 月超时的原因。
在临时仓库里,边运行边把两个输出流写入文件,不要等一次 communicate() 才决定是否保留:
with open('run.jsonl', 'wb') as events, open('run.stderr', 'wb') as diagnostics:
process = subprocess.Popen(
['codex', 'exec', '--ephemeral', '--sandbox', 'read-only',
'--json', '-C', repo, prompt],
stdin=subprocess.DEVNULL, stdout=events, stderr=diagnostics,
)
try:
exit_code = process.wait(timeout=120)
except subprocess.TimeoutExpired:
process.terminate()
exit_code = process.wait(timeout=5)
这段摘录假设已经定义 subprocess、repo 和 prompt。实际控制程序还要处理 terminate 无法结束进程的情况;我们 10 月留存的控制程序有 kill 路径。最后一个有效 JSONL event、退出码和 stderr 是三项独立证据。不要把 stderr 当 JSONL 解析,也不要上传未经检查的 trace。
首次运行可读Codex CLI 指南;配置 key 被忽略时可读config.toml 校验;交互任务也变慢时可读质量与延迟检查表。
最后核验:2026 年 10 月 2 日核对官方 event 与 stdin 说明,并完成一次保留 JSONL 的本地受控运行。未关闭的循环: 还需在 stdin、配置、模型和 provider 条件配对后重复任务,才能讨论 9 月超时的归因。