Cron 定时任务——用自然语言设置自动化
约 9 分钟2687 字1 次阅读
Cron 定时任务——用自然语言设置自动化
"每天早上9点推送今日天气报告"——一句话搞定自动化。
Hermes Agent 内置强大的 cron 调度器,可以用自然语言描述任务,然后定时推送到任意平台。与传统需要记忆复杂表达式的 cron 不同,Hermes Agent 让你用日常语言描述需求,系统自动解析并创建定时任务。这篇详细介绍 Cron 定时任务的使用方法和高级技巧。
一、Cron 调度器设计理念
1.1 传统 Cron 的痛点
传统 Unix cron 需要记忆复杂的表达式:
# 语法:分 时 日 月 周 命令
0 9 * * * /usr/local/bin/send_weather_report.sh
0 */2 * * * /usr/local/bin/health_check.sh
0 9 * * 1-5 /usr/local/bin/daily_standup.sh
传统 Cron 的问题:
- 语法晦涩难记
- 无法描述复杂时间逻辑
- 难以处理"工作日早上9点"这类模糊表达
- 任务失败无智能重试
- 没有内置的消息推送
1.2 Hermes Agent 的解决方案
Hermes Agent 的自然语言 cron 解析:
用户:帮我设置一个定时任务:每天早上9点推送今日天气报告
Hermes:
1. 解析时间:"每天早上9点" → cron: 0 9 * * *
2. 确认任务内容:获取天气报告
3. 确定推送目标:当前对话平台 (Telegram)
4. 创建任务:✅ 任务已创建
核心优势:
| 特性 | 传统 Cron | Hermes Cron |
|---|---|---|
| 时间描述 | 记忆表达式 | 自然语言 |
| 任务内容 | Shell 脚本 | AI 技能 |
| 推送方式 | 邮件/日志 | 多平台推送 |
| 失败处理 | 无 | 智能重试 |
| 依赖管理 | 手动 | 自动编排 |
1.3 技术架构
┌─────────────────────────────────────────────────────────┐
│ Hermes Agent Core │
├─────────────────────────────────────────────────────────┤
│ Cron Scheduler │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 时间解析器 │ │ 任务编排器 │ │ 执行引擎 │ │
│ │ (自然语言) │ │ (依赖+并行) │ │ (技能调用) │ │
│ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │
└─────────┼────────────────┼────────────────┼─────────────┘
│ │ │
▼ ▼ ▼
┌───────────┐ ┌───────────┐ ┌───────────┐
│ 任务队列 │──▶│ 执行单元 │──▶│ 推送适配 │
│ (Redis) │ │ (Worker) │ │ 器 │
└───────────┘ └───────────┘ └───────────┘
│
┌──────────────┬──────────┴──────────┐
▼ ▼ ▼
Telegram Discord Slack
二、基本用法详解
2.1 创建任务的四种方式
方式一:对话式创建(最常用)
用户:帮我设置一个定时任务,每天早上9点推送今日天气报告
Hermes:
✅ 任务已创建!
📅 时间:每天 09:00
📋 内容:获取天气报告
📮 推送:Telegram (@你的Bot)
🆔 任务ID:task_weather_daily
回复"取消这个任务"可删除
方式二:明确指定平台
每天早上9点,推送天气报告到 Discord #general 频道
方式三:多任务组合
每天早上9点:先检查天气,然后查询股票行情,最后生成简报
方式四:条件触发
每小时检查服务器状态,如果 CPU > 80% 则发送告警
2.2 查看与管理任务
列出所有任务:
/hermes cron list
输出示例:
📅 定时任务列表 (共 5 个)
┌────────────────────┬──────────────┬────────────┬────────┐
│ 任务名称 │ 时间 │ 平台 │ 状态 │
├────────────────────┼──────────────┼────────────┼────────┤
│ daily-weather │ 每天 09:00 │ Telegram │ ✅ 活跃│
│ hourly-health │ 每小时 │ Discord │ ✅ 活跃│
│ weekly-report │ 周一 10:00 │ Slack │ ✅ 活跃│
│ stock-alert │ 工作日 09:30 │ Telegram │ ⏸️ 暂停│
│ backup-night │ 每天 02:00 │ CLI │ ✅ 活跃│
└────────────────────┴──────────────┴────────────┴────────┘
查看单个任务详情:
查看 daily-weather 任务的详情
输出:
📋 任务详情:daily-weather
⏰ 执行计划:每天 09:00 (cron: 0 9 * * *)
📮 推送目标:Telegram (@HermesWeatherBot)
📝 执行技能:get-weather-report
🔄 重试策略:失败重试 3 次,间隔 5 分钟
📊 统计:
- 总执行:45 次
- 成功:43 次 (95.6%)
- 失败:2 次
- 最后执行:2026-05-10 09:00:15
- 下次执行:2026-05-11 09:00:00
2.3 删除与修改任务
删除任务:
取消每天早上9点的天气报告任务
或:
/hermes cron remove daily-weather
暂停任务:
暂停 stock-alert 任务
恢复任务:
恢复 stock-alert 任务
修改任务时间:
把这个任务的执行时间改到每天早上10点
三、时间描述语法详解
3.1 自然语言解析规则
Hermes Agent 的时间解析器使用语义理解而非简单正则匹配:
输入:每天早上9点
解析:
- "每天" → 周期:daily
- "早上9点" → 时间:09:00
- 结果:cron 0 9 * * *
输入:工作日上午9点30分
解析:
- "工作日" → 周一到周五
- "9点30分" → 09:30
- 结果:cron 30 9 * * 1-5
输入:每月1号下午3点
解析:
- "每月1号" → 每月1日
- "下午3点" → 15:00
- 结果:cron 0 15 1 * *
3.2 常见时间模式对照表
| 自然语言描述 | 解析结果 | Cron 表达式 |
|---|---|---|
| 每天早上9点 | 每天 09:00 | 0 9 * * * |
| 每天下午3点 | 每天 15:00 | 0 15 * * * |
| 每小时 | 每小时整点 | 0 * * * * |
| 每30分钟 | 每30分钟 | */30 * * * * |
| 每周一早上 | 每周一 09:00 | 0 9 * * 1 |
| 每周一至周五早上 | 工作日 09:00 | 0 9 * * 1-5 |
| 每周六周日早上 | 周末 09:00 | 0 9 * * 0,6 |
| 每月1号 | 每月1日 00:00 | 0 0 1 * * |
| 每月15号下午 | 每月15日 14:00 | 0 14 15 * * |
| 每年1月1号 | 每年1月1日 00:00 | 0 0 1 1 * |
| 每天凌晨2点 | 每天 02:00 | 0 2 * * * |
| 工作日下午6点 | 周一至周五 18:00 | 0 18 * * 1-5 |
3.3 相对时间(一次性任务)
| 描述 | 解析 | 用途 |
|---|---|---|
| 5分钟后 | 当前时间 + 5分钟 | 延时提醒 |
| 1小时后 | 当前时间 + 1小时 | 延时任务 |
| 明天早上 | 明天 09:00 | 定时提醒 |
| 下周一 | 下周一 09:00 | 会议提醒 |
| 下个月1号 | 下月1日 00:00 | 月末提醒 |
3.4 高级时间模式
复杂时间描述:
每隔2小时
→ cron: 0 */2 * * *
每45分钟
→ cron: */45 * * * *
每天9点到18点每小时
→ cron: 0 9-18 * * *
工作日9点到12点每30分钟
→ cron: */30 9-12 * * 1-5
每月最后一个周五
→ cron: 0 15 * * 5L
四、平台投递详解
4.1 支持的平台
| 平台 | 状态 | 特殊功能 |
|---|---|---|
| Telegram | ✅ 稳定 | 支持 Markdown/HTML、Keyboard |
| Discord | ✅ 稳定 | 支持 Embed、Webhook |
| Slack | ✅ 稳定 | 支持 Block Kit |
| 🧪 预览 | 模板消息 | |
| Email (SMTP) | ✅ 稳定 | HTML 邮件 |
| Webhook | ✅ 稳定 | 自定义 HTTP 回调 |
| CLI | ✅ 稳定 | 本地执行脚本 |
4.2 平台特定配置
Telegram 配置:
telegram:
# 支持 MarkdownV2 和 HTML
parse_mode: "HTML"
# 自定义键盘
reply_markup:
keyboard:
- ["📊 查看统计", "⚙️ 设置"]
- ["❓ 帮助"]
# 禁用网页预览
disable_web_page_preview: true
Discord Embed:
discord:
# Embed 样式
embed:
title: "📊 {{task_name}} 执行报告"
color: 5814783 # 绿色
fields:
- name: "执行时间"
value: "{{timestamp}}"
- name: "状态"
value: "{{status}}"
footer:
text: "Hermes Agent Cron"
Slack Block Kit:
slack:
blocks:
- type: "section"
text:
type: "mrkdwn"
text: "📊 *{{task_name}}* 执行报告"
- type: "divider"
- type: "context"
elements:
- type: "mrkdwn"
text: "执行时间: {{timestamp}}"
4.3 多平台同时推送
每天早上9点,同时推送天气报告到 Telegram 和 Slack #general
配置:
task:
name: "daily-weather-multi"
skill: "get-weather-report"
schedule: "0 9 * * *"
targets:
- platform: "telegram"
chat_id: "@weather_channel"
- platform: "discord"
channel_id: "123456789"
webhook: "custom-webhook-url"
- platform: "slack"
channel: "#general"
五、常用场景深度实战
5.1 每日站会简报
需求: 每天早上 10 点汇总昨天 GitHub commits,推送到 Slack
创建方式:
每天早上10点,汇总昨天的 GitHub commits 并推送到 Slack #dev-team 频道
Hermes 自动执行:
- 调用 GitHub API 获取用户 commits
- 按仓库分组汇总
- 生成 Markdown 格式简报
- 推送到 Slack
输出示例:
📊 2026-05-10 GitHub Commits 汇总
🏠 home-frontend
- fix: 修复用户登录状态丢失问题 (#234)
- feat: 添加暗黑模式切换 (#233)
🏠 api-service
- refactor: 重构用户认证模块 (#456)
- test: 添加单元测试 (#455)
📈 今日统计:5 commits, 2 PRs
5.2 夜间代码备份
需求: 每天凌晨 2 点备份项目到 S3
每天凌晨2点,备份 ~/projects 目录到 S3 bucket-backup
执行流程:
- 创建项目 tarball(排除 node_modules、.git)
- 上传到 S3(带日期前缀)
- 保留最近 7 份备份
- 发送备份报告到 Telegram
S3 配置:
task:
name: "nightly-backup"
schedule: "0 2 * * *"
skill: "s3-backup"
config:
source: "~/projects"
bucket: "my-backup-bucket"
retention: 7 # 保留7天
exclude:
- "node_modules"
- ".git"
- "*.log"
5.3 每周技术债务审计
需求: 每周一早上检查项目中的 TODO 和 FIXME
每周一早上9点,检查项目中的 TODO 和 FIXME,生成报告推送到 Discord
执行内容:
- 搜索所有代码文件中的 TODO、FIXME、HACK、XXX 注释
- 按严重程度分类
- 生成报告(按文件、标签分组)
- 推送到 Discord
输出示例:
📋 技术债务审计报告 - 2026-05-05
🔴 高优先级 (3)
src/auth/login.ts:42 - TODO: 替换为 OAuth2
src/payment/api.ts:128 - FIXME: 处理超时异常
tests/unit/auth.test.ts:15 - HACK: 临时绕过验证
🟡 中优先级 (7)
src/utils/format.ts:22 - TODO: 添加单元测试
...
📊 趋势:相比上周 +2 TODO, -1 FIXME
5.4 定时健康检查
需求: 每小时检查服务器状态,异常时发送告警
每小时检查服务器状态,CPU 或内存超过 80% 时发送告警到 Telegram
配置:
task:
name: "hourly-health"
schedule: "0 * * * *"
skill: "health-check"
condition: "cpu > 80 OR memory > 80"
targets:
- platform: "telegram"
chat_id: "@admin_channel"
告警内容:
⚠️ 服务器告警
🖥️ server-1
CPU: 92% 🔴
内存: 67% 🟡
磁盘: 45% 🟢
⏰ 检测时间: 2026-05-11 10:00:03
5.5 股票价格监控
需求: 工作日上午 9:30 检查关注的股票价格
工作日上午9:30,检查 AAPL、GOOGL、MSFT 股票价格,推送变动摘要
配置:
task:
name: "stock-morning"
schedule: "30 9 * * 1-5"
skill: "stock-checker"
config:
symbols: ["AAPL", "GOOGL", "MSFT"]
threshold: 2 # 变动超过 2% 才提醒
5.6 日报/周报自动生成
需求: 每天下午 6 点生成工作日报
每天下午6点,汇总我今天的日程、邮件、任务完成情况,生成日报
执行流程:
- 调用日历 API 获取今日会议
- 调用邮件 API 获取未读邮件
- 查询任务管理工具的完成记录
- 生成结构化日报
- 推送到指定平台
六、多任务编排
6.1 依赖链执行
场景: 任务 B 需要等任务 A 完成后执行
每天早上9点:
1. 先获取天气数据
2. 然后查询股票行情
3. 接着生成综合简报
4. 最后推送到 Slack
执行流程:
Task A (天气) ──┐
├──► Task C (生成简报) ──► Task D (推送)
Task B (股票) ──┘
配置写法:
tasks:
- name: "morning-brief"
chain:
- skill: "get-weather"
output_var: "weather_data"
- skill: "get-stock"
input: "${weather_data.date}"
output_var: "stock_data"
- skill: "generate-brief"
input:
weather: "${weather_data}"
stock: "${stock_data}"
- skill: "send-to-slack"
6.2 并行执行
场景: 多个独立任务同时执行
每天早上9点,同时执行:天气查询、股票查询、新闻聚合
配置:
task:
name: "morning-aggregate"
schedule: "0 9 * * *"
parallel:
- skill: "get-weather"
- skill: "get-stock"
- skill: "get-news"
merge_type: "combine" # 合并结果
6.3 条件分支
场景: 根据条件执行不同任务
如果天气晴朗,推送适合出行的建议;否则推送室内活动建议
配置:
task:
name: "weather-action"
schedule: "0 8 * * *"
conditional:
- condition: "weather == 'sunny'"
then:
- skill: "push-sunny-activities"
- condition: "weather == 'rainy'"
then:
- skill: "push-indoor-activities"
七、状态持久化与恢复
7.1 任务状态存储
任务状态存储在 Redis 中:
# redis 结构
hermes:cron:tasks
├── task_weather_daily
│ ├── schedule: "0 9 * * *"
│ ├── enabled: true
│ ├── last_run: 1715400000
│ ├── next_run: 1715486400
│ └── stats: {...}
└── ...
7.2 重启恢复机制
当 Hermes Agent 重启时:
1. 系统启动
2. 加载 cron 配置
3. 扫描 Redis 中的任务
4. 检查是否有遗漏执行的任务
5. 根据配置决定是否执行遗漏任务
配置项:
cron:
# 是否执行遗漏的任务
recover_missed: true
# 遗漏任务的最大延迟时间(秒)
# 超过这个时间则不执行
max_recovery_delay: 3600
# 恢复时的行为
recovery_action: "run" # run | skip | notify
7.3 执行状态追踪
/hermes cron status
输出:
📊 Cron 执行状态
┌────────────────────┬──────────────┬────────────┬────────────┐
│ 任务 │ 上次执行 │ 下次执行 │ 状态 │
├────────────────────┼──────────────┼────────────┼────────────┤
│ daily-weather │ 09:00:15 ✅ │ 09:00:00 │ 等待中 │
│ hourly-health │ 10:00:03 ✅ │ 11:00:00 │ 等待中 │
│ weekly-report │ Mon 10:00 ✅ │ Mon 10:00 │ 等待中 │
│ backup-night │ 02:00:22 ✅ │ 02:00:00 │ 等待中 │
└────────────────────┴──────────────┴────────────┴────────────┘
内存使用: 45MB
任务队列: 2 个待执行
八、监控与日志
8.1 执行日志查看
/hermes cron logs daily-weather
输出:
📜 日志:daily-weather (最近 20 条)
┌─────────────────────┬────────┬───────────────────────────┐
│ 时间 │ 状态 │ 详情 │
├─────────────────────┼────────┼───────────────────────────┤
│ 2026-05-11 09:00:15│ ✅ 成功│ 执行耗时: 3.2s │
│ 2026-05-10 09:00:22│ ✅ 成功│ 执行耗时: 4.1s │
│ 2026-05-09 09:00:18│ ✅ 成功│ 执行耗时: 2.8s │
│ 2026-05-08 09:00:45│ ❌ 失败│ 错误: API 限流 │
│ 2026-05-08 09:05:12│ ✅ 成功│ 重试成功,执行耗时: 3.5s │
│ ... │ ... │ ... │
└─────────────────────┴────────┴───────────────────────────┘
8.2 统计面板
/hermes cron stats daily-weather --days 30
输出:
📊 统计:daily-weather (30 天)
执行统计:
- 总执行:30 次
- 成功:28 次 (93.3%)
- 失败:2 次 (6.7%)
失败分析:
- API 限流:1 次
- 网络超时:1 次
性能:
- 平均耗时:3.4s
- 最快:2.1s
- 最慢:8.2s
时间分布:
- 09:00-09:05: 28 次
- 09:05-09:10: 2 次 (重试)
8.3 调试模式
测试任务执行(不等待定时):
/hermes cron test daily-weather --verbose
这会立即执行任务并输出详细日志,用于调试任务配置是否正确。
九、高级配置
9.1 直接使用 Cron 表达式
如果需要精确控制:
cron_tasks:
- name: "custom-task"
schedule: "0 */2 * * *" # 每2小时
skill: "my-skill"
platform: "telegram"
config:
param1: "value1"
9.2 条件执行
cron_tasks:
- name: "alert-task"
schedule: "0 * * * *"
# 只有满足条件才执行
condition: "server_status != 'ok'"
platform: "telegram"
9.3 失败重试策略
task:
name: "reliable-task"
retry:
max_attempts: 3 # 最多重试3次
initial_delay: 60 # 首次重试延迟 60s
max_delay: 300 # 最大延迟 5 分钟
exponential: true # 指数退避
9.4 超时控制
task:
name: "timeout-task"
timeout: 300 # 5 分钟超时
on_timeout: "cancel" # cancel | continue
9.5 速率限制
task:
name: "rate-limited-task"
rate_limit:
max_runs: 10
window: 3600 # 每小时最多10次
十、故障排查
10.1 常见问题
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 任务不执行 | 任务被暂停 | 使用 /hermes cron resume |
| 任务执行失败 | 技能配置错误 | 查看日志排查 |
| 消息没收到 | Webhook 配置错误 | 检查平台设置 |
| 执行延迟 | 队列积压 | 增加 worker 数量 |
| 重复执行 | 多实例运行 | 检查部署配置 |
10.2 调试命令
# 诊断任务问题
/hermes cron doctor daily-weather
# 测试技能是否正常工作
/hermes skill test get-weather
# 查看系统日志
/hermes logs --component cron --level debug
十一、命令汇总
11.1 CLI 命令
| 命令 | 功能 |
|---|---|
hermes cron add | 添加定时任务 |
hermes cron list | 查看任务列表 |
hermes cron remove <name> | 删除任务 |
hermes cron pause <name> | 暂停任务 |
hermes cron resume <name> | 恢复任务 |
hermes cron test <name> | 测试任务 |
hermes cron logs <name> | 查看日志 |
hermes cron stats <name> | 统计信息 |
hermes cron status | 查看状态 |
hermes cron doctor | 诊断问题 |
11.2 对话命令
查看我的所有定时任务
取消每天早上的天气任务
暂停 stock-alert 任务
恢复它
十二、总结
Hermes Agent 的 Cron 定时任务系统让自动化变得前所未有的简单:
- 自然语言描述:无需记忆 cron 表达式,像说话一样描述需求
- 多平台投递:Telegram、Discord、Slack、Email、Webhook 任意选择
- 智能编排:依赖关系、并行执行、条件分支全部支持
- 状态持久化:重启后自动恢复,遗漏任务智能处理
- 完整监控:日志、统计、调试工具一应俱全
核心价值: 把"每天都要手动做的事情"变成"说一句话就能自动执行"。
系列文章预告:
- (九)最佳实践与生态展望:日常使用最佳实践、安装配置清单、性能优化技巧、社区生态、Discord、Skills Hub、GitHub。Roadmap 与开源意义。快速查询核心命令。
你有哪些自动化需求?在评论区分享!