3.1 KiB
3.1 KiB
reader 日报链路在 OpenClaw/Feishu 外层执行中被 SIGTERM 截断
背景
2026-04-06 在 OpenClaw 中执行 reader 日报流程时,出现多次“前半段有产物、最终产物缺失”的现象。
典型表现:
- 能生成
raw/freshrss.raw.json - 能部分生成
extracted/item-xx.extracted.json - 但经常拿不到:
run-report.jsoncandidates/openclaw-delivery-payload.jsoncandidates/digest-brief.json
- 外层日志多次出现
Exec failed (..., signal SIGTERM)
已确认结论
1. RSS 抓取与排序正常
已确认:
- FreshRSS API 正常
- 原始 raw 数据能拉到
- 默认排序正常(默认相当于
r=d,新到旧)
因此问题不在:
- RSS 接口
- 鉴权
- 排序规则
2. reader 前半段模块正常
已确认:
- 单篇 summary 能成功
- 单篇 filter + candidate 构建能成功
因此问题不在:
- summary 模块整体损坏
- candidate 构建整体损坏
3. 真正问题在长链路执行方式
更合理的判断是:
整条 reader 日报 pipeline 是长串行任务,在 OpenClaw / Feishu 当前这条外层执行链路里,容易被外层执行环境提前
SIGTERM。
也就是说:
- 不是 reader 总是自己抛 Python 异常退出
- 更多是脚本尚未跑完,外层执行会话先被终止
关键认知
当天很多排障与补跑步骤,实际不是通过稳定常驻的 MCP 服务在跑,而是直接执行 reader 仓库里的 Python 脚本:
python scripts/run_freshrss_pipeline.pypython scripts/run_article_summaries.py
因此更准确地说:
当前 reader 正式日报运行入口偏 CLI/脚本模式,而不是稳定 MCP 服务调用模式。
这也是为什么长任务更容易受外层 exec 生命周期影响。
为什么前几次没问题
可能原因:
- 之前任务更短、内容更轻,刚好能在外层执行环境截断前跑完
- 之前不是链路天然稳,而是还没撞上边界条件
- 当前正式链路缺少稳健的断点恢复能力,因此一旦遇到较重任务,就暴露出问题
当天动作记录
做过的排查
- 确认 FreshRSS 默认排序
- 确认 raw 文件能生成
- 确认 extracted 文件能部分生成
- 单独验证单篇 summary 成功
- 单独验证单篇 filter / candidate 成功
做过的临时修复
当天曾尝试加入:
--resume- 中间产物复用
- 断点恢复思路
目的是降低 SIGTERM 后的损失。
当前状态
这些临时代码修改已全部回滚,reader 工作区已恢复干净。
当天结果
虽然正式链路异常,但通过手工恢复推进,最终仍补齐了:
candidates/openclaw-delivery-payload.jsoncandidates/digest-brief.jsonrun-report.json
当天最终保留文章:
- 1
- 3
后续建议
短期
- CLI 仅保留为 debug / fallback
- 不再把正式生产日报流主要建立在长脚本入口上
中期
- 将 reader 作为正式 MCP 服务
- OpenClaw 正式通过 MCP tool 调用:
run_freshrss_openclaw_pipelinegenerate_article_summaries
长期
让 reader 的正式能力具备:
- run_id
- status 查询
- resume
- 中间产物复用
- 分阶段补跑