Skip to content

SubAgent完成检测:4种方案对比+tmux wait-for最优解

2026年5月10日

这是「从 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 同时重定向

排查步骤

  1. 确认 tmux session 名称正确
  2. 确认信号名称左右一致
  3. 确认进程状态检查方式正确
bash
# 排查 tmux session
tmux list-sessions

# 排查 pane 状态
tmux list-panes -t $SESSION

# 排查进程
ps aux | grep codex

第三章:意外收获——非交互式模式更香

最后用的是非交互式模式,因为:

  1. 最简单:不需要配置 tmux
  2. 最稳定:没有信号同步问题
  3. 最可控:输出直接写入文件
  4. 最适合脚本:可以和其他命令组合
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-fortmux 内置信号机制
哨兵文件用于进程间通信的标记文件
轮询定期检查状态的机制
非交互式不需要用户交互的运行模式

系列目录

状态标题
1✅ 已发布为了省点 Claude Token,我做了一个简单的 Codex SubAgent 工具
2✅ 本文它干完了吗?给 SubAgent 加一个完成检测
3⏳ 待写一个不够用——多任务并行与结果管理
4⏳ 待写任务有先后——用 DAG 编排工作流
5⏳ 待写实战翻车记录
6⏳ 待写不止 Codex——让脚本支持多种 Agent
7⏳ 待写收官——把它变成 Claude Code 的一个 Skill

一句话总结

给 SubAgent 加完成检测,4 种方案按推荐顺序:

  1. tmux wait-for:零轮询、零延迟,需要正确配置
  2. 非交互式模式:最简单、最稳定、最可控
  3. 哨兵文件+轮询:简单直接,但浪费资源
  4. 进程监控:通用,但需要轮询

最佳实践:优先用非交互式模式,需要多 pane 协调时用 tmux wait-for。

不要孤军奋战啦!

加入微信群一起学习交流 AI

与大神一起使用 OpenClaw、Hermes、Claude Code、Seedance 2.0、GPT-Image-2 等

微信公众号

扫码关注微信公众号
私信 "加群",将自动获取微信群二维码

探索 AI 世界,掌握智能未来