Claude Code Dispatch 输出缓冲修复
问题日期: 2026-04-14
影响范围: claude-code-dispatch skill
问题现象
使用 dispatch.sh 派发任务后,Claude Code 在运行,但输出文件一直是空的:
bash
# 现象
task-output.txt # 0 bytes, 一直是空的
ps aux | grep claude # 进程在运行看起来像卡住了,实际是输出被缓冲了。
根因
claude_code_run.py 使用 subprocess.run() 等待进程结束才输出,导致:
- Claude 在工作
- 但输出被 Python 缓冲
- 看不到进展,以为卡住了
修复方案
1. claude_code_run.py — 改用流式输出
修复前:
python
proc = subprocess.run(cmd, stdout=subprocess.PIPE)
out_fd.write(proc.stdout) # 结束后才一次性写入修复后:
python
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, bufsize=1)
for line in proc.stdout:
out_fd.write(line)
out_fd.flush() # 逐行实时写入文件位置: ~/.openclaw/workspace/skills/claude-code-dispatch/scripts/claude_code_run.py
2. dispatch.sh — 改用后台运行
修复前:
bash
"${CMD[@]}" 2>&1 | tee "$TASK_OUTPUT" # tee 有缓冲修复后:
bash
"${CMD[@]}" --output-file "$TASK_OUTPUT" 2>&1 &
wait $! # 后台运行 + 等待文件位置: ~/.openclaw/workspace/skills/claude-code-dispatch/scripts/dispatch.sh
验证
bash
# 测试
nohup bash ~/.openclaw/workspace/skills/claude-code-dispatch/scripts/dispatch.sh \
-p "在不在?回复:在" \
-n "test-ping" \
--workdir /Users/wangyi/.openclaw/workspace \
--permission-mode bypassPermissions \
> /tmp/test.log 2>&1 &
# 10 秒后查看输出
sleep 10
cat ~/.openclaw/data/claude-code-results/task-output.txt
# 应该看到实时输出为什么 macOS 这么麻烦
| 工具 | 问题 |
|---|---|
script | macOS 版参数和 Linux 不同 |
stdbuf | macOS 默认没有 |
subprocess.run | 缓冲输出 |
最终方案:自己写流式输出(Popen + flush())
相关文件
claude_code_run.py— Claude Code 运行器dispatch.sh— 派发脚本task-output.txt— 输出文件
后续改进
Task Tracker (2026-04-14 更新)
新增文件: scripts/task-tracker.sh
功能:
- 自动追踪所有进行中的任务
- 超时告警(30 分钟)
- 完成后自动标记
用法:
bash
task-tracker.sh list # 查看进行中的任务
task-tracker.sh status # 查看状态(含超时检查)集成:
dispatch.sh自动添加任务notify-agi.sh自动标记完成
修复记录:2026-04-14 | 更新:2026-04-14 (task-tracker)