世界上有一种坚持叫"每天凌晨4点",它不属于人类,属于AI。 当你还在梦乡,你的Agent已经完成了数据采集、内容生成、报告发送——这就是Cron的魔法。
🕐 Cron表达式速查
Cron表达式由5-6个字段组成:
# 标准格式
* * * * * *
│ │ │ │ │ │
│ │ │ │ │ └── 星期 (0-7, 0和7都是周日)
│ │ │ │ └──── 月份 (1-12)
│ │ │ └────── 日期 (1-31)
│ │ └──────── 小时 (0-23)
│ └────────── 分钟 (0-59)
└──────────── 秒 (可选, 0-59)
# 特殊字符
* - 任意值
, - 列表,如 1,3,5
- - 范围,如 1-5
/ - 步进,如 */5 每5分钟
L - 最后 (日期/星期)
W - 最近工作日
常用表达式
| 场景 | Cron表达式 | 说明 |
|---|---|---|
| 每5分钟 | */5 * * * * | 高频监控 |
| 每小时 | 0 * * * * | 小时级任务 |
| 每天早上8点 | 0 8 * * * | 日报推送 |
| 工作日早9点 | 0 9 * * 1-5 | 工作提醒 |
| 每周一早上 | 0 9 * * 1 | 周报生成 |
| 每月1号 | 0 0 1 * * | 月报统计 |
| 最后工作日 | 0 18 LW * * | 月末总结 |
📋 Job配置详解
{
"name": "daily-report", // 任务名称,唯一标识
"description": "每日运营报告生成", // 描述
// ========== 调度配置 ==========
"schedule": {
"kind": "cron", // 类型: cron | at | every
"expr": "0 8 * * *", // cron表达式
"tz": "Asia/Shanghai" // 时区,默认UTC
},
// ========== 执行负载 ==========
"payload": {
"kind": "agentTurn", // agentTurn | systemEvent
"message": "执行每日报告任务...", // 给Agent的指令
"model": "claude-3-5-sonnet", // 模型覆盖
"timeoutSeconds": 300, // 超时时间,0表示不超时
"thinking": "on" // 推理模式
},
// ========== Session目标 ==========
"sessionTarget": "isolated", // main | isolated | current | session:xxx
// ========== 结果投递 ==========
"delivery": {
"mode": "announce", // none | announce | webhook
"channel": "discord", // 投递渠道
"to": "channel_id" // 具体目标
},
// ========== 失败处理 ==========
"failureAlert": {
"mode": "announce", // 告警方式
"channel": "ops-alerts",
"after": 3, // 连续失败几次后告警
"cooldownMs": 3600000 // 告警冷却时间
},
"enabled": true // 是否启用
}
🎯 SessionTarget详解
| 类型 | 说明 | 适用场景 |
|---|---|---|
main | 主会话,系统事件 | 轻量级通知、状态更新 |
isolated | 独立隔离会话 | 独立任务,默认推荐 |
current | 当前创建时的会话 | 绑定创建上下文 |
session:xxx | 指定持久化会话 | 项目专属会话 |
💡 选择建议
- isolated:大多数场景,任务隔离安全
- main:仅systemEvent可用,轻量通知
- session:project:长期项目,保持对话连续性
🚀 实战配置示例
📰 每日新闻聚合
{
"name": "daily-ai-news",
"schedule": { "kind": "cron", "expr": "0 8 * * *", "tz": "Asia/Shanghai" },
"payload": {
"kind": "agentTurn",
"message": "抓取AI新闻RSS,生成摘要,发送到Discord"
},
"sessionTarget": "isolated",
"delivery": { "mode": "announce", "channel": "discord" }
}
🔍 竞品监控(每小时)
{
"name": "competitor-watch",
"schedule": { "kind": "cron", "expr": "0 * * * *" },
"payload": {
"kind": "agentTurn",
"message": "检查竞品网站更新,如有变化记录到memory",
"timeoutSeconds": 120
},
"sessionTarget": "isolated",
"delivery": { "mode": "none" }, // 静默执行
"failureAlert": {
"after": 3,
"channel": "alerts"
}
}
📊 每周报告(周一早)
{
"name": "weekly-marketing-report",
"schedule": { "kind": "cron", "expr": "0 9 * * 1", "tz": "Asia/Shanghai" },
"payload": {
"kind": "agentTurn",
"message": "汇总上周数据:网站流量、SEO收录、社区互动"
},
"sessionTarget": "isolated",
"delivery": { "mode": "announce" }
}
🔔 一次提醒(10分钟后)
{
"name": "reminder-10min",
"schedule": { "kind": "at", "at": "2026-04-16T01:10:00+08:00" },
"payload": {
"kind": "systemEvent",
"text": "⏰ 10分钟到了,该检查任务状态了"
},
"sessionTarget": "main",
"deleteAfterRun": true
}
⚡ 高频轮询(每5分钟)
{
"name": "high-frequency-check",
"schedule": { "kind": "every", "everyMs": 300000 },
"payload": {
"kind": "agentTurn",
"message": "检查队列积压情况"
},
"sessionTarget": "isolated",
"delivery": { "mode": "none" }
}
🛠️ CLI操作
# 列出所有任务
openclaw cron list
# 查看任务详情
openclaw cron get --id daily-ai-news
# 手动触发任务
openclaw cron run --id daily-ai-news
# 查看任务执行历史
openclaw cron runs --id daily-ai-news --limit 10
# 更新任务
openclaw cron update --id daily-ai-news --patch '{"enabled": false}'
# 删除任务
openclaw cron remove --id daily-ai-news
# 唤醒Scheduler(立即检查)
openclaw cron wake
⚠️ 高级配置与坑点
Webhook投递
{
"delivery": {
"mode": "webhook",
"to": "https://your-server.com/webhook",
"bestEffort": true // 失败不重试
}
}
失败转移
{
"failureAlert": {
"mode": "webhook",
"to": "https://backup-server.com/alert",
"failureDestination": {
"mode": "announce",
"channel": "emergency"
}
}
}
⚠️ 常见坑点
- 时区错误:Cron按UTC解析,务必设置tz字段
- sessionTarget=main时必须用systemEvent
- timeoutSeconds=0表示永不超时,谨慎使用
- 高频任务(<5分钟)可能堆积,检查队列深度
- deleteAfterRun=true的任务执行后不可恢复
🎓 调试技巧
- 先用
openclaw cron run --id xxx手动测试 - 查看
openclaw cron runs了解执行历史 - 设置短的everyMs测试,验证后改回cron
- 开启delivery观察输出,稳定后改none