晚上 8 点,日报 Cron 准时触发。日志显示执行成功,内容写入 Obsidian,一切正常。
但消息没有送达。Telegram 静悄悄,飞书也空空如也。你看了一晚上日志,发现 任务确实跑完了,只是消息根本没发出去。
这不是偶发。如果你同时配置了多个消息渠道,几乎必然踩到这个坑。
大多数 Agent 框架(OpenClaw、Hermes 等)支持多渠道消息推送。当你配置了 Telegram + 飞书 + 微信等多个渠道,Cron 任务执行完成后,框架需要一个明确的指令:往哪个渠道发?
默认行为是:不指定 = 发到主渠道。但如果你有多个渠道,框架可能:
最坑的是第三种。stdout 显示任务成功,没有任何 error,但消息根本没有离开服务器。
// 看起来完全正常的配置 { "name": "daily-evening-summary", "schedule": "0 20 * * *", "model": "glm-4.5-flash", "prompt": "总结今天的 work log,生成日报" // ↑ 缺少 channel 指定 }
这份配置在单渠道环境完全正常。但当你同时有 Telegram 和飞书时,执行日志:
[20:00:01] Cron triggered: daily-evening-summary [20:00:03] Model response received (glm-4.5-flash) [20:00:03] Content written to Obsidian ✓ [20:00:04] Sending to channel: default [20:00:04] → Telegram: silently dropped (not primary) [20:00:04] → Feishu: not specified, skipped [20:00:05] Task completed successfully ✓ // 成功了。但消息呢?
一行参数解决问题:
{
"name": "daily-evening-summary",
"schedule": "0 20 * * *",
"model": "glm-4.5-flash",
"prompt": "总结今天的 work log,生成日报",
"deliver": "feishu" // ← 加这一行
}
或者如果你的框架用命令行参数:
# 显式指定渠道 cron run daily-summary --channel feishu # 多渠道同时发 cron run daily-summary --channel feishu,telegram
如果你的 Cron 任务也出现「成功但没消息」,按这个顺序排查:
| 检查项 | 怎么看 | 正常状态 |
|---|---|---|
| 渠道指定 | 查配置文件有没有 channel 或 deliver |
显式指定,不依赖默认 |
| 执行日志 | grep "Sending\|delivered\|dropped" cron.log |
看到明确的渠道名和 sent 状态 |
| Memory 日志 | 检查日报内容是否写入了 memory/ 目录 |
有当天日期的 .md 文件 |
| API 限流 | 检查目标渠道 API 有没有 429 错误 | 无 rate limit 报错 |
--channel feishu,省一晚上查日志。
顺带说一下 Cron 的成本优化。不是所有定时任务都需要最强模型:
| 任务类型 | 推荐模型 | 理由 |
|---|---|---|
| 日报/摘要 | glm-4.5-flash | 模板化输出,轻量够用 |
| 笔记整理 | glm-5.1 | 需要语义理解,保证质量 |
| 推文摘要 | glm-4.5-flash | 信息提取为主,不需要推理 |
| 周研究综述 | glm-4.5-flash | 量大人少,省 token |
原则:简单 cron 用 flash,复杂任务才上 pro。6 个定时任务跑一个月,成本差 5-8 倍。
--channel feishu