Hermes Cron 与后台系统
定时任务系统
text
cron/
├── jobs.py # Job 存储管理(1,539 行)
├── scheduler.py # 调度器
└── scheduler_provider.py # Gateway 内嵌调度Job 存储
json
// ~/.hermes/cron/jobs.json
{
"id": "abc123",
"name": "天气播报",
"prompt": "查询北京今天的天气...",
"schedule": "0 8 * * *",
"skills": ["weather"],
"model": {"provider": "custom", "model": "gpt-5.6-sol"},
"enabled": true,
"deliver": "telegram",
"script": null,
"no_agent": false
}Job 执行周期
Ticker (每 60s)
↓
load_jobs()
↓
for job in due_jobs:
mark_job_starting()
spawn_agent(job) # 在隔离线程中
agent.run_conversation(job.prompt)
save_output() # ~/.hermes/cron/output/{job_id}/{timestamp}.md
deliver() # 推送到指定平台
mark_job_completed()
advance_next_run()两种执行模式
LLM-Driven(默认)
python
# job 的 prompt/skills 交给 LLM
# agent 自己决定用什么工具、怎么回答Script-Only(no_agent=True)
python
# 执行 script,stdout 作为消息直接推送
# 无 LLM 参与,零 token 消耗
# 适合:磁盘预警、进程监控、心跳检测Job 链
python
# cronjobs 支持 job 之间的上下文传递
job_b = {
"prompt": "分析数据",
"context_from": ["job_a_id"] # 注入 job_a 的最近输出
}Safety
| 机制 | 说明 |
|---|---|
| Cross-process lock | fcntl.flock 防止并发写入 jobs.json |
| Immutable ID | 创建后不可改,防止路径穿越 |
| Ticker heartbeat | ticker_heartbeat 文件,status 检查调度器存活 |
| Success heartbeat | ticker_last_success 文件,区分"活着但失败" |
| One-shot grace | 一次性任务有 120s 宽限期 |
Pi / OpenCode 有没有 Cron?
| 项目 | Cron |
|---|---|
| Pi | ❌ 无 |
| OpenCode | ❌ 无(可在外部 cron 调用 CLI) |
| Hermes | ✅ 核心功能,内嵌调度器 |
Hermes 的 cron 是它区别于 coding agent 框架的最大差异之一——它体现了 Hermes 作为"个人 AI 操作系统"的取向。