Appearance
这是「从 0 开始构建专属 Agent Team」系列第 2 篇。现在就是 Codex 干完活了,Claude Code 不知道。 这篇我们就来解决这个问题:怎么让 Claude 自动知道 Codex 已经干完了。
本文目录
- 第一章:问 Claude 有什么好办法
- 第二章:翻车、排查与换方案
- 第三章:意外收获——非交互式模式更香
- 第四章:遗留问题与总结
第一章:问 Claude 有什么好办法
有问题,第一反应问 Claude。这也是用 AI 很重要的一个思维:AI First。
我有个问题:我在 tmux 里用 Codex CLI 做子 Agent,它在右边 pane 干活。但它干完之后不会通知我,我得自己去看。我想让左边的脚本自动知道 Codex 已经完成了,有什么好办法?
Claude 说这是很常见的 tmux 多 pane 协调问题,给了从简单到优雅的几种方案:
4种方案对比
| 方案 | 原理 | 优点 | 缺点 |
|---|---|---|---|
| 方案1:tmux wait-for | 内置信号机制 | 零轮询、零延迟 | 需要正确配置 |
| 方案2:哨兵文件+轮询 | 右pane写标记文件 | 简单直接 | 轮询浪费资源 |
| 方案3:监控pane进程状态 | 检查进程是否退出 | 通用 | 需要轮询 |
| 方案4:非交互式模式 | 用脚本替代交互 | 最简单 | 无交互反馈 |
方案1:tmux wait-for(推荐)
右 pane 执行完 Codex 后发信号,左 pane 等待信号:
bash
# 右 pane(Codex执行完后)
tmux wait-for -S codex-done
codex run "完成你的任务"
tmux wait-for -S codex-done
# 左 pane(等待)
tmux wait-for codex-done
echo "Codex 干完了!"方案2:哨兵文件+轮询
右 pane 写个标记文件,左 pane 轮询检查:
bash
# 右 pane
codex run "完成你的任务"
touch /tmp/codex_done.txt
# 左 pane(轮询脚本)
while [ ! -f /tmp/codex_done.txt ]; do
sleep 2
done
echo "Codex 干完了!"
rm /tmp/codex_done.txt缺点:轮询浪费资源,有延迟。
方案3:监控pane进程状态
左 pane 监控右 pane 的进程是否退出:
bash
# 获取 pane 的进程 ID
PANE_ID=$(tmux display-message -p '#{pane_id}')
PID=$(tmux list-panes -t $SESSION -F "#{pane_pid}")
# 或者用 ps 检查进程
while ps -p $PID > /dev/null 2>&1; do
sleep 2
done
echo "Codex 干完了!"缺点:需要轮询,有延迟。
方案4:非交互式模式(最香)
用脚本替代交互式调用:
bash
#!/bin/bash
# run_codex.sh
# 把 Codex 的输出写入文件
codex run "完成你的任务" > /tmp/codex_output.txt 2>&1
# 脚本继续执行
echo "Codex 干完了!"
cat /tmp/codex_output.txt第二章:翻车、排查与换方案
翻车记录
| 问题 | 原因 | 解决 |
|---|---|---|
| tmux wait-for 不触发 | 信号名拼写错误 | 确认左右 pane 信号名一致 |
| 轮询脚本卡死 | 进程还在运行 | 用 ps 检查进程状态 |
| 非交互模式输出丢失 | stdout 重定向问题 | 用 2>&1 同时重定向 |
排查步骤
- 确认 tmux session 名称正确
- 确认信号名称左右一致
- 确认进程状态检查方式正确
bash
# 排查 tmux session
tmux list-sessions
# 排查 pane 状态
tmux list-panes -t $SESSION
# 排查进程
ps aux | grep codex第三章:意外收获——非交互式模式更香
最后用的是非交互式模式,因为:
- 最简单:不需要配置 tmux
- 最稳定:没有信号同步问题
- 最可控:输出直接写入文件
- 最适合脚本:可以和其他命令组合
bash
#!/bin/bash
# agent_runner.sh
function run_subagent() {
local TASK="$1"
local OUTPUT_FILE="$2"
echo "启动 SubAgent: $TASK"
codex run "$TASK" > "$OUTPUT_FILE" 2>&1 &
local PID=$!
# 可以在这里做其他事情
echo "SubAgent PID: $PID"
# 等待完成
wait $PID
echo "SubAgent 完成!"
cat "$OUTPUT_FILE"
}
# 使用示例
run_subagent "帮我重构 src/utils.ts" "/tmp/codex_output.txt"第四章:遗留问题与总结
遗留问题
| 问题 | 状态 | 说明 |
|---|---|---|
| SubAgent 异常退出检测 | 待解决 | 目前无法区分正常退出和异常退出 |
| 进度反馈 | 待解决 | 非交互模式没有实时进度 |
| 多 SubAgent 并行 | 待解决 | 需要协调多个进程 |
关键词速查表
| 关键词 | 说明 |
|---|---|
| SubAgent | 子代理,执行子任务的 AI Agent |
| tmux wait-for | tmux 内置信号机制 |
| 哨兵文件 | 用于进程间通信的标记文件 |
| 轮询 | 定期检查状态的机制 |
| 非交互式 | 不需要用户交互的运行模式 |
系列目录
| 篇 | 状态 | 标题 |
|---|---|---|
| 1 | ✅ 已发布 | 为了省点 Claude Token,我做了一个简单的 Codex SubAgent 工具 |
| 2 | ✅ 本文 | 它干完了吗?给 SubAgent 加一个完成检测 |
| 3 | ⏳ 待写 | 一个不够用——多任务并行与结果管理 |
| 4 | ⏳ 待写 | 任务有先后——用 DAG 编排工作流 |
| 5 | ⏳ 待写 | 实战翻车记录 |
| 6 | ⏳ 待写 | 不止 Codex——让脚本支持多种 Agent |
| 7 | ⏳ 待写 | 收官——把它变成 Claude Code 的一个 Skill |
一句话总结
给 SubAgent 加完成检测,4 种方案按推荐顺序:
- tmux wait-for:零轮询、零延迟,需要正确配置
- 非交互式模式:最简单、最稳定、最可控
- 哨兵文件+轮询:简单直接,但浪费资源
- 进程监控:通用,但需要轮询
最佳实践:优先用非交互式模式,需要多 pane 协调时用 tmux wait-for。
