
【Cron定时任务】OpenClaw自动化调度------打造7x24小时无人值守AI工作流
从"被动响应"到"主动服务",让AI成为永不掉线的数字员工
引言:为什么需要主动式AI?
大多数AI助手都是"被动响应式"的:你问它答,你指令它执行。但在真实的生产环境中,我们更需要主动式AI------它能在指定时间自动执行任务,定期检查系统状态,甚至根据事件触发复杂工作流。
试想以下场景:
- 每天早上8点,自动汇总财经新闻推送到手机
- 每小时检查服务器负载,超过阈值立即告警
- 每当代码仓库有新的Pull Request,自动运行代码审查
这些场景的共同点在于:AI需要在没有用户直接指令的情况下,按照预定计划主动工作。这正是OpenClaw Cron定时任务的核心价值所在。
OpenClaw的Cron子系统将Unix传统工具cron与AI智能体的能力完美结合,让开发者可以用自然语言定义任务,用AI执行复杂逻辑,最终实现7×24小时无人值守的自动化工作流。
本文将深入解析OpenClaw Cron的设计原理、配置方法,并通过两个完整实战案例,带你掌握如何打造永不掉线的AI数字员工。
一、Cron任务基础:存储、调度与命令
1.1 存储路径与配置格式
OpenClaw的所有定时任务存储在 ~/.openclaw/cron/ 目录下。每个任务可以是一个独立的JSON或YAML文件,OpenClaw启动时会扫描该目录加载所有任务。
bash
~/.openclaw/cron/
├── daily-briefing.yaml # 每日晨报任务
├── server-monitor.yaml # 服务器监控任务
├── backup-task.yaml # 备份任务
└── triggered/ # WebHook触发任务存放目录
任务文件的基本结构(YAML示例):
yaml
# daily-briefing.yaml
name: 每日财经晨报
description: 每天早上8点抓取财经RSS,生成摘要并推送至微信
schedule: "0 8 * * *" # Cron表达式
type: cron # cron / at / interval
enabled: true
skill: rss-summary # 要调用的Skill名称
params: # Skill参数
feeds:
- https://feed1.com/rss
- https://feed2.com/rss
output: wechat
retry:
max_attempts: 3 # 失败重试3次
backoff: 60 # 间隔60秒重试
notify:
on_success: false # 成功不通知
on_failure: true # 失败通知
channel: dingtalk # 通过钉钉通知
1.2 调度类型
OpenClaw支持三种调度模式:
- Cron表达式:最灵活的定时方式,支持标准的5位或6位Cron格式(分 时 日 月 周)
- 间隔任务 :每隔固定时间执行,如
every 30 minutes - 一次性任务 :在指定时间执行一次,如
at 2026-03-15 14:00
调度类型
Cron表达式
0 8 * * *
间隔任务
every 30 minutes
一次性任务
at 2026-03-15 14:00
每日8点
每30分钟
指定时间执行一次
任务调度器
执行Skill
1.3 核心命令
OpenClaw提供了便捷的CLI命令管理Cron任务:
bash
# 添加每日8点晨报任务
openclaw cron add \
--name daily-briefing \
--schedule "0 8 * * *" \
--skill rss-summary \
--params '{"feeds":["https://feed1.com"],"output":"wechat"}'
# 查看任务列表
openclaw cron list
# 输出示例:
# ID 名称 调度 下次执行 状态
# task_001 每日晨报 0 8 * * * 2026-03-16 08:00 active
# task_002 服务器监控 0 * * * * 2026-03-15 15:00 active
# 暂停任务
openclaw cron pause task_001
# 恢复任务
openclaw cron resume task_001
# 删除任务
openclaw cron remove task_002
# 立即执行一次(测试)
openclaw cron run task_001
二、实战案例1:每日财经情报汇总
这个案例中,我们将构建一个每日自动运行的财经情报机器人,它会在每天早上8点抓取指定RSS源,用AI生成摘要,并通过微信推送给用户。
2.1 任务逻辑设计
是
否
异常处理
重试次数<3
重试次数=3
抓取失败
重试计数器
等待60秒后重试
发送失败告警
每日8点触发
抓取RSS源列表
解析RSS获取最新文章
文章数量>0?
调用LLM生成摘要
记录"无更新"
格式化消息
通过微信渠道推送
结束
2.2 开发RSS摘要Skill
首先,我们需要一个能处理RSS抓取和摘要生成的Skill。创建文件 ~/.openclaw/skills/rss-summary/index.ts:
typescript
import Parser from 'rss-parser';
import { LLM } from 'openclaw-sdk';
interface Params {
feeds: string[]; // RSS源列表
output: 'wechat' | 'dingtalk' | 'console';
maxItems?: number; // 每个源最多取多少条,默认5
}
export async function handler(params: Params) {
const parser = new Parser();
const allItems = [];
// 1. 抓取所有RSS源
for (const feedUrl of params.feeds) {
try {
const feed = await parser.parseURL(feedUrl);
const items = feed.items.slice(0, params.maxItems || 5).map(item => ({
title: item.title,
link: item.link,
contentSnippet: item.contentSnippet?.slice(0, 200) + '...',
pubDate: item.pubDate
}));
allItems.push(...items);
} catch (error) {
console.error(`抓取失败: ${feedUrl}`, error);
throw new Error(`RSS抓取失败: ${feedUrl}`);
}
}
// 2. 如果没有新文章,返回提示
if (allItems.length === 0) {
return {
code: 0,
data: '今日暂无财经更新'
};
}
// 3. 调用LLM生成摘要
const llm = new LLM();
const prompt = `请将以下财经新闻整理成一份简洁的晨报摘要(200字以内),包含核心要点和可能的投资影响:\n${JSON.stringify(allItems, null, 2)}`;
const summary = await llm.complete(prompt);
// 4. 格式化输出
const message = `📈 **财经晨报 ${new Date().toLocaleDateString()}**\n\n${summary}`;
// 5. 根据output参数推送
if (params.output === 'wechat') {
await sendToWechat(message);
} else if (params.output === 'dingtalk') {
await sendToDingtalk(message);
} else {
console.log(message);
}
return {
code: 0,
data: '推送成功'
};
}
// 微信推送函数(简化)
async function sendToWechat(content: string) {
// 调用微信机器人API
// 具体实现取决于使用的微信渠道
}
2.3 配置Cron任务
创建 ~/.openclaw/cron/daily-briefing.yaml:
yaml
name: daily-briefing
schedule: "0 8 * * *"
type: cron
enabled: true
skill: rss-summary
params:
feeds:
- https://www.36kr.com/feed
- https://www.jiemian.com/rss
- https://www.cls.cn/feed
output: wechat
maxItems: 3
retry:
max_attempts: 3
backoff: 60
notify:
on_failure: true
channel: dingtalk
recipients: ["admin"]
2.4 异常处理机制
当任务执行失败时,OpenClaw会自动重试(最多3次),间隔60秒。如果最终仍然失败,会通过配置的渠道(如钉钉)发送告警通知。
Admin Notifier Skill Scheduler Admin Notifier Skill Scheduler 执行任务 失败(抛异常) 记录失败次数=1 等待60秒 重试(第2次) 失败 记录失败次数=2 等待60秒 重试(第3次) 失败 发送告警:任务失败 钉钉通知
三、实战案例2:服务器健康监控(每小时)
第二个案例是监控服务器资源使用率,每小时检查一次,当CPU、内存或磁盘超过阈值时自动发送飞书告警。
3.1 任务逻辑设计
是
否
是
否
是
否
是
否
每小时触发
获取CPU使用率
获取内存使用率
获取磁盘使用率
CPU > 80%?
记录CPU告警
G
内存 > 85%?
记录内存告警
J
磁盘 > 90%?
记录磁盘告警
M
有告警?
格式化告警消息
发送飞书
无操作
3.2 开发监控Skill
创建 ~/.openclaw/skills/server-monitor/index.ts:
typescript
import si from 'systeminformation';
import { sendFeishu } from './feishu'; // 飞书发送模块
interface Params {
cpuThreshold?: number; // CPU阈值,默认80
memThreshold?: number; // 内存阈值,默认85
diskThreshold?: number; // 磁盘阈值,默认90
diskPath?: string; // 监控的磁盘路径,默认根目录
alertChannel?: 'feishu' | 'dingtalk';
}
export async function handler(params: Params) {
const cpuThreshold = params.cpuThreshold || 80;
const memThreshold = params.memThreshold || 85;
const diskThreshold = params.diskThreshold || 90;
const diskPath = params.diskPath || '/';
const channel = params.alertChannel || 'feishu';
// 1. 获取系统信息
const [cpu, mem, disk] = await Promise.all([
si.currentLoad(),
si.mem(),
si.fsSize()
]);
const cpuPercent = Math.round(cpu.currentLoad);
const memPercent = Math.round((mem.active / mem.total) * 100);
const diskInfo = disk.find(d => d.mount === diskPath);
const diskPercent = diskInfo ? Math.round(diskInfo.use) : 0;
// 2. 检查阈值
const alerts = [];
if (cpuPercent > cpuThreshold) {
alerts.push(`🔴 CPU使用率过高: ${cpuPercent}% (阈值${cpuThreshold}%)`);
}
if (memPercent > memThreshold) {
alerts.push(`🔴 内存使用率过高: ${memPercent}% (阈值${memThreshold}%)`);
}
if (diskPercent > diskThreshold) {
alerts.push(`🔴 磁盘使用率过高: ${diskPercent}% (阈值${diskThreshold}%)`);
}
// 3. 如果有告警,发送通知
if (alerts.length > 0) {
const message = `🚨 **服务器告警**\n时间: ${new Date().toLocaleString()}\n` + alerts.join('\n');
if (channel === 'feishu') {
await sendFeishu(message);
} else {
// 其他渠道...
}
return {
code: 0,
data: '告警已发送',
alerts
};
}
return {
code: 0,
data: '所有指标正常',
metrics: { cpu: cpuPercent, mem: memPercent, disk: diskPercent }
};
}
3.3 配置Cron任务
创建 ~/.openclaw/cron/server-monitor.yaml:
yaml
name: server-monitor
schedule: "0 * * * *" # 每小时的第0分钟执行
type: cron
enabled: true
skill: server-monitor
params:
cpuThreshold: 80
memThreshold: 85
diskThreshold: 90
diskPath: "/"
alertChannel: feishu
retry:
max_attempts: 2
backoff: 30
notify:
on_success: false
on_failure: true
channel: dingtalk
3.4 测试与验证
使用命令立即执行一次:
bash
openclaw cron run server-monitor
查看日志确认执行结果:
bash
tail -f ~/.openclaw/logs/cron.log
四、高级用法:WebHook触发与任务依赖
4.1 WebHook触发任务
除了定时执行,OpenClaw还支持通过HTTP WebHook触发任务。这在Git Push、代码部署等场景非常有用。
配置一个WebHook任务:
yaml
# ~/.openclaw/cron/triggered/pr-review.yaml
name: pr-review
type: webhook # 指定为WebHook触发
webhook_path: /webhook/github # 监听路径
method: POST # 允许的HTTP方法
secret: "your_github_secret" # 用于验证签名
skill: code-review
params:
repo: "{{body.repository.full_name}}"
pr_number: "{{body.pull_request.number}}"
当GitHub发送WebHook到 https://your-openclaw-server/webhook/github 时,OpenClaw会验证签名,然后执行code-review Skill,并将PR信息作为参数传入。
Skill OpenClaw GitHub Skill OpenClaw GitHub POST /webhook/github (PR event) 验证签名 匹配webhook_path对应的任务 执行code-review skill 审查结果 返回200 OK
4.2 任务依赖与工作流
有时候一个任务的执行需要依赖另一个任务的结果。例如:先抓取数据,再生成报表,最后推送。OpenClaw可以通过在任务中调用其他Skill或使用条件判断来实现工作流。
一种实现方式是让一个Skill在完成自身工作后,主动触发另一个Cron任务(通过OpenClaw的API)。例如:
typescript
// 在数据抓取Skill的最后
await openclaw.cron.trigger('generate-report', { dataId: result.id });
或者使用更复杂的编排方式:定义一个"工作流"Skill,它依次调用多个子Skill。
是
否
定时触发
数据抓取Skill
抓取成功?
报表生成Skill
记录错误并退出
推送Skill
五、成本控制:单任务Token消耗优化
Cron任务可能频繁调用LLM,导致Token消耗激增。OpenClaw提供了多种优化策略。
5.1 本地模型处理简单逻辑
对于不需要强大推理能力的任务(如格式化数据、简单判断),可以配置使用本地Ollama模型,大幅降低成本。
在任务配置中指定模型:
yaml
params:
model: ollama/llama3:8b # 强制使用本地模型
5.2 缓存机制
对于重复性查询(如抓取相同RSS),可以启用缓存:
yaml
cache:
enabled: true
ttl: 3600 # 缓存1小时
5.3 批量处理与合并
将多个小任务合并为一个批量任务,减少模型调用次数。例如,每小时检查服务器状态和抓取日志可以合并为一个任务。
5.4 成本监控
OpenClaw内置成本统计,可通过命令查看:
bash
openclaw cron cost --period day
输出示例:
任务ID 调用次数 输入Token 输出Token 预估成本($)
daily-briefing 30 15000 6000 0.42
server-monitor 24 4800 1200 0.12
六、监控与告警:确保任务可靠执行
生产环境中,必须确保Cron任务可靠执行。OpenClaw提供了完善的监控和告警机制。
6.1 任务执行日志
所有Cron任务的执行记录保存在 ~/.openclaw/logs/cron.log,格式为JSONL,每行包含时间、任务ID、状态、耗时、错误信息等。
json
{"time":"2026-03-15T08:00:01Z","task":"daily-briefing","status":"success","duration":3.2}
{"time":"2026-03-15T09:00:01Z","task":"server-monitor","status":"failed","error":"RSS抓取超时","duration":10.1}
6.2 失败告警
如前面示例所示,可以在任务配置中设置 notify.on_failure,指定通过钉钉、飞书等渠道发送告警。告警内容包含任务名称、失败时间、错误信息。
6.3 监控大盘
将Cron日志接入Prometheus + Grafana,可以构建可视化监控大盘:
告警
监控系统
OpenClaw
cron.log
Promtail
Loki
Grafana
Alertmanager
钉钉
关键指标:
- 任务成功率
- 任务执行耗时
- 失败任务分布
- Token消耗趋势
七、结语:让AI真正"卷"起来
从被动响应到主动服务,OpenClaw的Cron定时任务系统为AI智能体赋予了全新的生命力。无论是日常信息汇总、系统监控,还是复杂的工作流编排,OpenClaw都能让AI在无人值守的情况下持续创造价值。
本文通过两个完整案例,展示了如何利用OpenClaw的Cron功能构建实用的自动化工作流。掌握这些技能后,你可以:
- 打造个人专属的资讯助理,每天定时推送定制化内容
- 构建企业级监控系统,7×24小时守护服务器健康
- 实现DevOps自动化,代码提交后自动触发测试、部署、审查
下一篇文章,我们将深入OpenClaw的多Agent协同,探讨如何让多个智能体分工协作,完成更复杂的任务。敬请期待!
本文所有Mermaid图均可直接复制到支持Mermaid的Markdown编辑器中查看。如果你在配置Cron任务时遇到任何问题,欢迎在评论区留言交流。