Hermes 自动化进阶:用 Cron 实现从每日简报到自定义监控

如果你已经在用 Hermes Agent,却从未碰过它的 Cron 调度器,那你正在浪费它最强大的功能之一。Hermes 的 Cron 不是简单的“每过一小时跑个脚本”——它是一个完整的自动化框架:支持自然语言调度、技能增强型 Agent、多任务流水线、以及零 Token 的纯脚本看门狗。
通过本文,你将学会:
- 用自然语言或 Cron 表达式安排定时/一次性任务
- 给任务挂载技能,让 Agent 继承专家工作流
- 用
context_from串联多个任务构成流水线 - 运行纯脚本看门狗,完全不消耗 LLM Token
- 搭建生产级每日简报、GitHub 监控和网站健康检查
我们从基础开始。
Hermes Cron 有何不同?
大多数 Cron 实现是在一个定时器上执行单个脚本。而 Hermes Cron 是在定时器上启动一个完整的 Agent 会话——你的提示词就是任务,Agent 可以使用所有工具(终端、文件、网页、浏览器、子代理),结果会被投递到你选择的聊天平台。
核心思路: Hermes 里的 Cron 任务,本质上就是一个“定时启动的 Hermes 会话”。你在对话里能让 Hermes 做的任何事,都可以定时让它自动完成。
在此基础上,Hermes Cron 还支持:
- 技能注入——在运行提示词之前先加载一个或多个技能
- 流水线串联——一个任务的输出自动成为下一个任务的上下文
- 免 Agent 模式——纯定时脚本,零 Token 消耗,stdout 原样投递
- 多平台投递——发到 Telegram、Discord、Slack、邮件、短信、飞书等任何已配置的平台
- 完整生命周期管理——暂停、恢复、编辑、手动触发,聊天或 CLI 均可
调度器运行在 Hermes Gateway 后台守护进程中,每 60 秒 tick 一次。任务存储在 ~/.hermes/cron/jobs.json,使用文件锁(~/.hermes/cron/.tick.lock)防止重叠调度。
基础用法:三种方式创建任务
你可以通过三种方式创建 Cron 任务,最终都会进入同一个调度器。
1. 聊天中使用 /cron 命令
对话中最快捷的方式——直接输入 /cron:
/cron add "every 2h" "检查服务器状态,报告任何问题"
/cron add "0 9 * * *" "总结昨天项目仓库的提交记录"
/cron add "30m" "提醒我站起来活动一下"
挂载技能:
/cron add "every 1h" "检查 Feed 是否有新文章" --skill blogwatcher
2. 独立 CLI 命令
CLI 版本完全一致,适合脚本化使用:
hermes cron create "every 2h" "检查服务器状态"
hermes cron create "0 9 * * *" "总结昨天的提交记录" --name "每日总结"
挂载多个技能:
hermes cron create "every 1h" "监控 Feed 和地图" \
--skill blogwatcher \
--skill maps \
--name "多技能监控器"
3. 自然对话
直接告诉 Hermes 你想要什么:
“每天早上 9 点,检查 Hacker News 的 AI 新闻,把摘要发到 Telegram。”
Hermes 会自动使用内部的 cronjob 工具来创建任务——不用记任何命令。
日程格式参考
Hermes 支持四种日程格式:
| 格式 | 示例 | 行为 |
|---|---|---|
| 相对延迟 | 30m, 2h, 1d |
一次性,延迟后执行一次 |
| 间隔 | every 30m, every 2h, every 1d |
循环执行直到删除 |
| Cron 表达式 | 0 9 * * *(每天)、0 9 * * 1-5(工作日)、0 */6 * * *(每 6 小时) |
按固定时间循环 |
| ISO 时间戳 | 2026-12-25T09:00:00 |
未来特定时间执行一次 |
你还可以覆盖默认重复次数:
cronjob(
action="create",
prompt="检查邮箱是否有紧急消息",
schedule="every 2h",
repeat=5, # 只运行 5 次,然后自动删除
)
技能增强型 Cron 任务
当挂载技能时,真正的威力就展现出来了。一个技能封装了一套可复用的工作流——Cron 任务加载它后,Agent 自动继承了该领域的专业知识,不需要你把长篇大论的指令塞进提示词里。
单个技能
cronjob(
action="create",
skill="blogwatcher",
prompt="检查已配置的 Feed,总结任何新内容。",
schedule="0 9 * * *",
name="晨间 Feed",
)
多个技能
技能按顺序加载,提示词作为最终的任务指令叠加在所有技能之上:
cronjob(
action="create",
skills=["blogwatcher", "maps"],
prompt="查找新的本地活动和有趣的地点,组合成一份简短简报。",
schedule="every 6h",
name="本地简报",
)
实用建议: 用技能做关注点分离。一个“数据收集”技能负责获取原始数据,一个“格式化”技能美化输出,一个“投递”技能负责路由。不同的任务可以混合搭配不同的技能。
在项目目录中运行
默认情况下,Cron 任务在 detached 模式下运行——不会加载任何 CLAUDE.md 或 AGENTS.md。传递 --workdir(CLI)或 workdir=(工具调用)可以让任务在特定仓库中运行:
hermes cron create "every 1d at 09:00" \
"审核待审 PR,总结 CI 健康状况,发到 #eng 频道" \
--workdir /home/me/projects/acme
当设置了 workdir 后,该目录下的项目上下文文件会被注入到系统提示中,所有文件/终端工具都会以该目录为工作路径。
串行化注意: 设置了
workdir的任务会串行执行(不在并行池中),因为它们会改变进程全局的终端状态。没有设置workdir的任务仍然并行执行。
进阶:用 context_from 搭建多任务流水线
Cron 任务运行在隔离的会话中,不记得前一次运行的结果。但有时一个任务的输出恰好是下一个任务需要的内容。context_from 参数自动串联起这条链路。
流水线模式
我们搭建一个 3 阶段的 AI 新闻流水线——采集、筛选、投递:
# 第一步:找到采集任务的 ID
cronjob(action="list")
# 第二步:创建筛选任务,自动接收采集任务的输出
cronjob(
action="create",
prompt="读取 ~/.hermes/data/briefs/raw.md。对每条新闻的参与潜力和新颖度评分 1-10。输出前 5 条到 ~/.hermes/data/briefs/ranked.md。",
schedule="30 7 * * *",
context_from="<collector_job_id>",
name="AI 新闻筛选",
)
# 第三步:创建投递任务,接收筛选任务的输出
cronjob(
action="create",
prompt="读取 ~/.hermes/data/briefs/ranked.md。写 3 条推文草稿(钩子 + 正文 + 话题标签)。",
schedule="0 8 * * *",
context_from="<triage_job_id>",
deliver="telegram:7976161601",
name="AI 新闻简报",
)
context_from 的工作原理:
- 当任务 B 触发时,Hermes 从
~/.hermes/cron/output/{job_a_id}/*.md读取任务 A 的最新输出 - 该输出自动预置到任务 B 的提示词前
- 流水线可以是任意长度:A → B → C → …
- 可以传单个 ID(字符串)或多个 ID 的列表(汇聚模式)
何时使用流水线:
- 多阶段处理(采集 → 过滤 → 格式化 → 投递)
- 有依赖关系的任务,步骤 N 需要步骤 N−1 的结果
- 扇出/扇入:一个聚合任务从多个采集任务收集结果
免 Agent 模式:纯脚本看门狗
对于不需要 LLM 的重复性任务——经典的系统看门狗、磁盘/内存告警、心跳检测、CI 通知——传递 no_agent=True。调度器按计划运行脚本并直接投递 stdout,零 Token,零推理调用。
CLI 设置
hermes cron create "every 5m" \
--no-agent \
--script memory-watchdog.sh \
--deliver telegram \
--name "memory-watchdog"
由 Agent 自动设置
直接在聊天中告诉 Hermes:
“如果内存超过 85%,每 5 分钟在 Telegram 上通知我。”
Hermes 会把检查脚本写入 ~/.hermes/scripts/,并自动配置好 Cron 任务。
免 Agent 模式的行为规则
| 情况 | 行为 |
|---|---|
| 脚本有 stdout(非空) | 原样投递作为消息 |
| stdout 为空 | 静默 tick——什么都不发(看门狗模式) |
| 退出码非零或超时 | 发送错误通知(防止看门狗无声失效) |
最后一行是 {"wakeAgent": false} |
静默 tick(与 LLM 任务使用同一门控) |
脚本文件规则:
.sh/.bash→ 使用/bin/bash运行- 其他后缀 → 使用当前 Python 解释器(
sys.executable)运行 - 必须放在
~/.hermes/scripts/目录下
真实案例——内存看门狗脚本:
#!/bin/bash
# ~/.hermes/scripts/memory-watchdog.sh
THRESHOLD=85
USAGE=$(free | awk '/^Mem:/ {printf "%.0f", $3/$2 * 100}')
if [ "$USAGE" -gt "$THRESHOLD" ]; then
echo "⚠️ RAM 告警:已使用 ${USAGE}%(阈值:${THRESHOLD}%)"
echo "占用最高的进程:"
ps aux --sort=-%mem | head -6
fi
# 如果低于阈值,无 stdout → 静默 tick
这个脚本只在内存超过 85% 时输出内容。平静的日子不发任何消息——无打扰,不浪费注意力。
生命周期管理
每个 Cron 任务都有完整的生命周期。你可以从 CLI 或聊天中全盘管理。
CLI 命令
hermes cron list # 列出所有任务(--all 显示已禁用的)
hermes cron pause my-digest # 按名称或 ID 暂停
hermes cron resume my-digest # 重新启用
hermes cron run my-digest # 在下一个 tick 触发
hermes cron edit my-digest --schedule "every 4h" # 修改日程
hermes cron edit my-digest --prompt "修改后的任务"
hermes cron edit my-digest --add-skill maps # 添加技能
hermes cron edit my-digest --remove-skill maps # 移除技能
hermes cron edit my-digest --clear-skills # 清除所有技能
hermes cron remove my-digest # 完全删除
hermes cron status # 调度器状态
hermes cron runs my-digest --limit 20 # 执行历史
聊天中管理
/cron list
/cron pause <job_id>
/cron resume <job_id>
/cron run <job_id>
/cron edit <job_id> --schedule "every 4h"
/cron remove <job_id>
支持按名称查找: 所有命令都可以使用任务 ID(十六进制)或任务名称(不区分大小写)。如果有多个任务同名,命令会列出候选 ID 让你进一步区分。
执行历史
Hermes 将每次 Cron 执行记录在 ~/.hermes/cron/executions.db。每次尝试经历:claimed → running → 最终状态 completed、failed 或 unknown(进程重启后)。用 hermes cron runs [job-id] --limit 20 查看。
服务商恢复与模型固定
Cron 任务继承了你在配置中设置的回退服务商和凭证池轮转。如果主 API Key 被限流,任务会自动回退到备选服务商或轮换到池中的下一个凭证。
重要——模型固定行为: 创建 Cron 任务时如果不指定 provider/model,Hermes 会将当前的全局默认设置快照到任务中。如果之后你修改了全局默认,任务会安全关闭——跳过运行并提醒你显式固定 provider/model。这样可以防止无人值守的任务悄悄切换到付费服务或不同模型:
# 为任务固定一个特定模型
cronjob(
action="update",
job_id="<job_id>",
provider="openrouter",
model="anthropic/claude-sonnet-4",
)
对于无人值守运行,hermes setup --portal(Nous Portal OAuth)是最低摩擦的选项——OAuth 刷新是自动的。
安全规则: Cron 运行中的会话不能创建新的 Cron 任务。Hermes 在 Cron 执行期间会禁用 Cron 管理工具,防止出现失控的调度循环。
投递配置
平台定位
创建任务时,通过 deliver 参数指定结果发往哪里:
# 发到 Telegram
cronjob(action="create", ..., deliver="telegram")
# 发到指定的 Discord 频道
cronjob(action="create", ..., deliver="discord:#engineering")
# 发到多个平台
cronjob(action="create", ..., deliver="telegram,discord")
# 广播到所有已连接的家频道
cronjob(action="create", ..., deliver="all")
# 发回来源 + 所有频道
cronjob(action="create", ..., deliver="origin,all")
支持的平台包括 Telegram、Discord、Slack、WhatsApp、Signal、短信、邮件、飞书、钉钉、企业微信、Matrix 等。
静默模式
如果 Agent 的最终回复中包含 [SILENT],投递会被抑制。输出仍会本地保存以备审计,但不会发送消息:
# 提示词文本:
"检查 nginx 是否在运行。如果一切正常,只回复 [SILENT]。否则报告问题。"
失败的任务总是会投递——只有成功运行才能被静默抑制。
回复包装
默认情况下,投递的 Cron 输出会带有头/尾包装:
Cronjob Response: 晨间 Feed
-------------
<agent 的输出>
注意:Agent 无法看到此消息,因此无法回复。
要投递原始输出而不带包装:
# ~/.hermes/config.yaml
cron:
wrap_response: false
可延续任务(回复 Cron 消息)
默认情况下,Cron 投递是“发完即忘”。将任务设为可延续(通过 attach_to_session=True),你就可以回复它——简报变成了可以对话的内容:
# ~/.hermes/config.yaml
cron:
mirror_delivery: true
或者在工具中按任务设置:
cronjob(
action="create",
...,
attach_to_session=True,
)
在支持线程的平台(Telegram 话题、Discord 线程)上,每次投递都会开启一个专用线程。对于仅 DM 的平台(WhatsApp、Signal),简报会镜像到 DM 会话中。
实战场景:三个经过验证的配置
1. 个人每日简报
每天早上收集 GitHub 动态、天气和日历事项:
hermes cron create "0 8 * * 1-5" \
"1. 检查我的 GitHub 通知,看是否有 PR 需要我审核
2. 查询今天的天气预报
3. 总结日历上需要关注的事项
4. 整理成一份干净的晨间简报" \
--deliver telegram \
--name "daily-briefing"
为什么这样设计: 只在工作日运行(1-5),使用 Hermes 内置的网页搜索和文件工具,直接投递到 Telegram,喝咖啡时就能看。
2. GitHub 仓库看门狗
一个零 Token 的纯脚本,在仓库发布新版时通知你:
#!/bin/bash
# ~/.hermes/scripts/github-watchdog.sh
REPO="NousResearch/hermes-agent"
CACHE_FILE="$HOME/.hermes/cron/output/latest_release.txt"
LATEST=$(curl -s "https://api.github.com/repos/$REPO/releases/latest" | grep -o '"tag_name": *"[^"]*"' | head -1)
if [ ! -f "$CACHE_FILE" ]; then
echo "$LATEST" > "$CACHE_FILE"
echo "📦 已初始化 $REPO 的监控器——最新版:$LATEST"
exit 0
fi
PREVIOUS=$(cat "$CACHE_FILE")
if [ "$LATEST" != "$PREVIOUS" ]; then
echo "$LATEST" > "$CACHE_FILE"
echo "🚀 $REPO 检测到新版本!"
echo " 之前:$PREVIOUS"
echo " 最新:$LATEST"
echo " 查看:https://github.com/$REPO/releases/tag/$LATEST"
fi
配置任务:
hermes cron create "every 6h" \
--no-agent \
--script github-watchdog.sh \
--deliver telegram \
--name "github-release-watchdog"
零 Token 消耗。 脚本每 6 小时运行一次,只有版本真正变化时才发消息。
3. 网站健康检查器
一个多阶段流水线:网站检查 → 日志分析 → 告警投递。
阶段 1——采集器(纯脚本):
#!/bin/bash
# ~/.hermes/scripts/health-check.sh
URL="https://hermes-agent-lab.com"
STATUS=$(curl -s -o /dev/null -w "%{http_code}" --max-time 10 "$URL")
TIME=$(curl -s -o /dev/null -w "%{time_total}" --max-time 10 "$URL")
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
echo "[$TIMESTAMP] $URL → HTTP $STATUS (${TIME}s)"
hermes cron create "every 30m" \
--no-agent \
--script health-check.sh \
--name "site-health-collector"
阶段 2——分析器(由 LLM 驱动,从采集器接收上下文):
hermes cron create "0 */2 * * *" \
"检查 hermes-agent-lab.com 最近 4 次的健康检查结果。
是否有明显的失败或响应缓慢?
如果一切正常,只回复 [SILENT]。
如果有问题,写出问题摘要并投递。" \
--context_from "<collector_job_id>" \
--name "site-health-analyst"
采集器每 30 分钟运行一次(免费,零 Token)。分析器每 2 小时运行一次,接收采集器的输出作为上下文,只在有问题时才发消息。
常见陷阱与解决方法
1. 忘记启动 Gateway
Cron 的执行由 Gateway 守护进程处理。如果不运行 Gateway,你的任务不会触发:
hermes gateway install # 安装为用户服务
hermes gateway status # 确认在运行
hermes gateway run # 或者前台运行用于测试
2. 相对延迟与间隔混淆
30m= 一次性,30 分钟后执行every 30m= 循环,每 30 分钟执行
这是常见的错误。确实需要循环时,记得加上 every。
3. 静默任务从不发消息
如果任务运行了但你看不到输出,Agent 可能回复了 [SILENT](成功时),或者脚本没有产生 stdout(免 Agent 模式)。检查本地输出:
ls ~/.hermes/cron/output/
cat ~/.hermes/cron/output/<job_id>/*.md
4. 模型/服务商突然不工作了
未固定的任务在创建时快照了当前默认设置。如果你改了服务商(hermes model),任务会提醒你显式固定。生产任务一定要固定:
hermes cron edit my-job --provider openrouter --model anthropic/claude-sonnet-4
5. 流水线任务时间重叠
当使用 context_from 串联任务时,确保上游任务在下游任务开始前已完成。如果任务 A 在 0 7 * * *(7:00)运行,任务 B 也在 0 7 * * *(7:00)运行,任务 B 得到的是任务 A 前一天的输出——如果是首次运行则是空文件。将它们的触发时间至少错开 15–30 分钟。
6. Workdir 任务互相阻塞
设置了 workdir 的任务会串行执行。设计流水线时要注意,不要让 workdir 任务成为瓶颈——保持它们简短,或者对繁重处理使用无 workdir 的中转任务。
总结
Hermes Cron 让你从手动操作升级为设置好就不用管。以下是速查表:
| 任务 | 方法 | LLM 成本 |
|---|---|---|
| 个人每日简报 | 单个 LLM 任务 + 网页搜索 | 低 |
| GitHub 发布监控 | 纯脚本看门狗 | 零 |
| 网站健康检查 + 告警 | 流水线:纯脚本采集器 → LLM 分析器 | 低(每 2 小时一次) |
| AI 新闻流水线 | 多任务链 + context_from |
中等 |
| 磁盘/内存看门狗 | 纯脚本看门狗 | 零 |
| 多平台广播 | 单个任务 + deliver="all" |
低 |
全功能 Agent 会话、技能注入、免 Agent 纯脚本模式、多任务流水线的组合,使 Hermes Cron 成为任何 AI Agent 框架中最通用的自动化工具之一。
快速上手
# 1 分钟入门:创建你的第一个任务
hermes cron create "every 1d at 09:00" "给我 3 句话总结一下今天 NousResearch/hermes-agent 仓库有什么新动态" --deliver telegram
# 列出并确认
hermes cron list
hermes cron status
# 手动触发查看效果
hermes cron run my-job-name
想了解更多 Hermes 自动化功能,参见官方 Cron 文档、我们的安装指南和功能对比页。