前言:比老板还勤快的Agent
凌晨1点。凌晨2点。凌晨3点。你睡着了,但你的Agent没睡。它还在生成SEO页面、搜索AI新闻、更新竞品报告。
这就是cron定时任务的力量。这篇教程教你如何让Agent像守护进程一样,7×24小时不间断地工作。
OpenClaw Cron 系统
OpenClaw的cron系统通过定时触发Agent会话来执行任务。任务触发时会附带一个cron标记,让你可以区分是定时任务还是用户交互触发的。
核心原理:cron触发 → 新建/恢复会话 → 发送预设prompt → Agent执行任务 → 结果通知
Cron 表达式基础
# ┌───────────── 分钟 (0 - 59)
# │ ┌───────────── 小时 (0 - 23)
# │ │ ┌───────────── 日期 (1 - 31)
# │ │ │ ┌───────────── 月份 (1 - 12)
# │ │ │ │ ┌───────────── 星期 (0 - 6, 0=周日)
# │ │ │ │ │
# * * * * *
| 表达式 | 含义 | 用途 |
|---|---|---|
0 1 * * * |
每天凌晨1点 | 大规模SEO生成 |
0 */2 * * * |
每2小时 | RSS内容聚合 |
0 8 * * * |
每天早上8点 | AI新闻日报 |
0 0 * * 5 |
每周五午夜 | 周报汇总 |
0 6 * * 1-5 |
工作日早上6点 | GitHub自动化 |
0 23 * * * |
每天晚上11点 | 内链优化 |
妙趣AI的定时任务矩阵
01:00
大规模SEO内容生成
02:00
SEO巡检(死链/meta/sitemap)
03:00
竞品监控分析
04:00
AI术语百科生成
06:00
GitHub自动化运营
08:00
AI新闻日报生成
12:00 / 18:00
热点追踪(每日3次)
22:00
每日营销报告
定时任务最佳实践
1. 错峰执行
把重型任务安排在凌晨,避免影响用户交互。SEO批量生成放01:00,巡检放02:00,竞品分析放03:00。
2. 留出间隔
任务之间至少间隔30分钟,给系统喘息的空间。不要两个重型任务同时跑。
3. 健康检查
// 在定时任务中加入健康检查
async function cronTask() {
const start = Date.now();
try {
// 执行核心任务
await executeTask();
// 记录成功日志
log(`任务成功完成,耗时 ${Date.now() - start}ms`);
} catch (error) {
// 错误通知
log(`任务失败: ${error.message}`);
await notifyAdmin(`任务失败: ${error.message}`);
}
}
4. 超时保护
每个定时任务都应该有超时保护,防止任务卡死导致后续任务排队:
// 设置任务超时
const timeout = 60 * 60 * 1000; // 1小时
const result = await Promise.race([
executeTask(),
new Promise((_, reject) =>
setTimeout(() => reject(new Error("任务超时")), timeout)
)
]);
5. 幂等性设计
定时任务可能重复触发(如系统重启)。设计任务时要保证幂等性——执行多次和执行一次结果相同:
- 文件生成前检查是否已存在
- 数据库操作使用upsert而非insert
- 通知发送前检查是否已发送过
妙趣AI实践:我们的SEO生成任务每天凌晨1点运行。在生成前会检查当天是否已生成过页面(通过文件名日期判断),避免重复生成。
Gateway 守护进程
OpenClaw的Gateway是核心守护进程,负责调度定时任务和管理Agent会话:
# 查看Gateway状态
openclaw gateway status
# 启动Gateway
openclaw gateway start
# 停止Gateway
openclaw gateway stop
# 重启Gateway
openclaw gateway restart
重要:如果Gateway挂了,所有定时任务都会停止。建议配置系统级守护(systemd)确保Gateway自动重启。
QQ Bot 定时提醒
OpenClaw还支持QQ Bot定时提醒,通过qqbot_remind工具实现:
// 创建一次性提醒(5分钟后)
await qqbot_remind({
action: "add",
content: "记得喝水",
time: "5m"
});
// 创建周期提醒(每天8点)
await qqbot_remind({
action: "add",
content: "每日晨会",
time: "0 8 * * *"
});
// 查看已有提醒
await qqbot_remind({ action: "list" });
// 删除提醒
await qqbot_remind({
action: "remove",
jobId: "job-id"
});
最佳实践总结
- 错峰执行:重型任务安排在凌晨
- 留出间隔:任务之间至少30分钟
- 超时保护:每个任务都有最大运行时间
- 幂等设计:重复执行不会产生副作用
- 日志记录:每次执行记录开始/结束时间
- 异常通知:失败时自动通知管理员
- Gateway守护:确保核心进程不挂