Skip to content

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 这么麻烦

工具问题
scriptmacOS 版参数和 Linux 不同
stdbufmacOS 默认没有
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)

Made by Yi with OpenClaw