惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

酷 壳 – CoolShell
酷 壳 – CoolShell
Schneier on Security
Schneier on Security
H
Help Net Security
PCI Perspectives
PCI Perspectives
博客园 - 司徒正美
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Google Online Security Blog
Google Online Security Blog
V
Visual Studio Blog
Engineering at Meta
Engineering at Meta
Last Week in AI
Last Week in AI
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
L
LINUX DO - 最新话题
GbyAI
GbyAI
IT之家
IT之家
TaoSecurity Blog
TaoSecurity Blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
J
Java Code Geeks
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
N
News and Events Feed by Topic
Recent Announcements
Recent Announcements
Google DeepMind News
Google DeepMind News
美团技术团队
T
Troy Hunt's Blog
Security Archives - TechRepublic
Security Archives - TechRepublic
Cloudbric
Cloudbric
A
About on SuperTechFans
Recorded Future
Recorded Future
Microsoft Security Blog
Microsoft Security Blog
阮一峰的网络日志
阮一峰的网络日志
H
Hacker News: Front Page
Forbes - Security
Forbes - Security
Webroot Blog
Webroot Blog
D
DataBreaches.Net
L
LangChain Blog
S
Schneier on Security
博客园_首页
S
SegmentFault 最新的问题
Apple Machine Learning Research
Apple Machine Learning Research
N
News | PayPal Newsroom
Hacker News - Newest:
Hacker News - Newest: "LLM"
爱范儿
爱范儿
量子位
T
The Exploit Database - CXSecurity.com
博客园 - 【当耐特】
T
Threatpost
The Hacker News
The Hacker News
N
News and Events Feed by Topic
罗磊的独立博客
Spread Privacy
Spread Privacy
Hacker News: Ask HN
Hacker News: Ask HN

博客园 - 我才是银古

第16章:常见问题、排错与最佳实践 第15章:扩展生态、MCAD 与外部集成 第12章:实战案例:机械结构与 3D 打印零件 第14章:构建、测试、调试与贡献流程 第13章:OpenSCAD 源码架构与核心执行流程 第11章:预览、渲染、网格精度与性能优化 第09章:列表推导、递归与算法建模 第08章:参数化零件库与复用设计 第10章:导入导出、命令行与自动化 第06章:CSG 布尔建模方法 第07章:二维图形、拉伸、旋转与投影 第05章:基础几何、坐标系与变换 第04章:参数、变量、函数、模块与作用域 OpenSCAD 教程目录 第03章:OpenSCAD 语言基础 第02章:安装、环境配置与开发工作流 第01章:OpenSCAD 项目全景与学习路线 第02章:源码获取、编译与开发环境配置 第01章:OCCT项目全景与学习路线 第18章:二次开发实战与综合案例 第17章:与 Qt VTK Python pythonOCC 生态集成 第18章:综合实战案例 第17章:数据交换与协同 第16章:源码架构与二次开发 第15章:插件与自定义工作台开发 第14章:Python脚本宏与自动化 第13章:FEM仿真分析 第12章:CAM数控加工 第11章:SurfaceMesh与逆向工程 第10章:Draft二维绘图与BIM建筑 第09章:工程图TechDraw 第07章:参数化表达式与Spreadsheet 第08章:装配设计Assembly 第06章:Part工作台与几何内核 第05章:PartDesign实体特征建模 第04章:草图Sketcher约束建模 第02章:安装版本与工作环境配置 第03章:界面工作台与基础操作 第01章:项目全景与学习路线 第十二章:插件开发、研究功能与最佳实践 第七章:技能、记忆与自学习闭环 第八章:MCP 集成与上下文文件 第六章:工具系统与终端后端 第五章:模型供应商与配置体系 Hermes Agent 教程目录 第十一章:语音、视觉、浏览器与子代理协作 第四章:CLI/TUI 与会话管理 第十二章:学习路线、实战方案与最佳实践 第十一章:源码结构、开发调试与插件开发 第十章:自动化、远程访问、日志与排障 第九章:Control UI、节点、Canvas 与语音能力 第七章:工具、技能、插件与能力扩展 第八章:安全模型、访问控制与沙箱实践 第六章:Agent 工作区、会话与多智能体路由 第五章:多通道消息接入与聊天平台配置 第四章:配置体系、模型接入与认证管理 第三章:Gateway 架构、协议与运行机制 第二章:安装、环境准备与快速上手 第一章:OpenClaw 项目概览与核心定位 oh-my-openagent 教程目录 09-命令模型回退与配置参考 10-实战案例最佳实践与故障排除 05-工作模式-Ultrawork-Prometheus-Atlas 08-Hooks与MCP系统 06-Category与Skill系统 07-核心工具链 04-智能体全景详解 03-安装与环境配置 02-整体架构与多模型编排机制 01-项目简介与核心理念 01-项目概览与学习路线 02-安装部署与工具适配 03-Skill机制与using-superpowers 05-TDD系统化调试与完成前验证 04-需求澄清方案设计与计划编写 07-并行智能体子智能体与Git-Worktree 第六章:代码审查、反馈处理与分支收尾 08-中国特色Skills与本土团队落地 09-MCP构建工作流执行与自定义Skill 第23章:FreeCAD-Python-API Clipper2 C# 源码解读教程 第19章:PolyTree 多边形树结构 第20章:实际应用与最佳实践 第18章:Minkowski 和与差 第17章:RectClip 矩形裁剪优化 第16章:ClipperOffset 偏移类详解 第15章:填充规则详解 第14章:布尔运算执行流程 第13章:ClipperD 浮点裁剪类 第11章:OutRec 与 OutPt 输出结构 第9章:Active 活动边结构 第10章:Vertex 顶点与 LocalMinima 局部极小值 第12章:Clipper64 裁剪类详解 第7章:高精度运算与128位整数 第8章:ClipperBase 基类详解 第5章:枚举类型与常量定义 第6章:InternalClipper 内部工具类 第2章:核心数据结构 - Point64、PointD 第3章:路径与多边形表示 - Path64、PathD、Paths64、PathsD 第4章:矩形边界 - Rect64、RectD
第十章:定时任务与自动化(Cron)
我才是银古 · 2026-05-04 · via 博客园 - 我才是银古

第十章:定时任务与自动化(Cron)

Hermes 不只是"问答"——它内置完整的 cron 调度器 与一组让自动化"既灵活又安全"的工程能力,让你可以用自然语言或标准 cron 表达式安排任意周期 / 一次性任务,并把结果投递到任意平台。本章把 cron 的所有玩法、与技能 / Webhook / Kanban 的协作模式、以及若干"开箱即用"的自动化模板讲清。

10.1 Cron 是什么

Hermes 的 cron 不是简单的"每隔多久跑一条命令"。它的核心抽象是:

一个 cronjob = 一个调度规则 + 一个新的 Agent 会话 + 一组可选技能 + 一个或多个投递目标

每次到点:

  1. Hermes 创建一个 fresh agent session(独立上下文、独立 task_id);
  2. 加载该 job 关联的技能(可 0 个或 N 个);
  3. 按你的 prompt 让 Agent 自由决策;
  4. 把最终回复(含附件)投递到指定目标:原始对话、Telegram、Discord、Slack、企业微信、飞书、邮件、本地文件等;
  5. 记录运行历史到 ~/.hermes/hermes.db

⚠ Cron 内部的 Agent 不能再创建 cron 任务——cronjob 工具会被禁用,避免失控的递归调度。

10.2 创建 cron 的三种方式

10.2.1 在 TUI 用 /cron

/cron add 30m "30 分钟后提醒我去检查构建"
/cron add "every 2h" "每 2 小时检查一次服务器状态"
/cron add "every 1h" "总结新的 RSS 内容" --skill blogwatcher
/cron add "0 9 * * *" "每天早 9 点把昨日 Hacker News 顶 5 条发我 Telegram"
/cron list
/cron pause <id>
/cron resume <id>
/cron run <id>      # 立即触发一次
/cron edit <id>
/cron remove <id>

10.2.2 用 hermes cron 命令行

hermes cron create "every 2h" "Check server status"
hermes cron create "every 1h" "Summarize new feed items" --skill blogwatcher
hermes cron create "every 1h" "Use both skills" --skill blogwatcher --skill maps --name "Combo job"
hermes cron list
hermes cron pause <id>
hermes cron remove <id>

10.2.3 自然语言驱动

最爽的方式——让 Hermes 自己去理解:

我希望每个工作日早 9:30,你帮我把昨晚的 GitHub PR 评审提醒整理一下,发到我企业微信。

Hermes 会调用 cronjob 工具自动创建 job、绑定技能、设置投递目标。你可以接着说"换成早 9 点"就会改。

10.3 调度表达式

支持以下几类:

  • 相对时间30m2h3d90s;表示"X 之后跑一次(一次性任务)"。
  • every 表达式every 1hevery 30mevery 2 days;周期性。
  • 标准 cron0 9 * * **/15 * * * *,5 字段(分时日月周)。
  • 自然语言every workday at 9:30each Monday morningweekdays at 18:00,由模型解析后写成 cron。

时区默认跟随系统;可以全局指定:

cron:
  timezone: Asia/Shanghai

或单 job:/cron add "every day 9:00" --tz Asia/Shanghai "..."

10.4 把技能挂上 cron

任意 cron job 可以挂 0 / 1 / N 个技能。技能在每次执行前作为 Level-1 注入,效果等同于"用户在那次会话中执行了 /skill-name"。

/cron add "every 1h" "刷一遍我关注的博客并总结" --skill blogwatcher --skill maps

适合:日常巡检、复杂工作流(让模型不用每次都重新"理解"流程)。

10.5 投递目标(Delivery Targets)

每个 job 可以指定结果发到哪。常见目标:

URI 含义
origin 原始对话(你创建 job 的会话)
telegram://<chat_id> Telegram 用户 / 群
discord://<channel_id> Discord 频道
slack://<channel> Slack
wecom://group:<name> / wecom://user:<userid> 企业微信
feishu://group:<id> 飞书
dingtalk://group:<id> 钉钉
email://<to@example.com> 邮件(用 subject: 字段)
file:///abs/path 写本地文件
webhook://<url> POST 到 URL
console 仅打印到 Gateway 日志

例:

/cron add "every day 9:00" "把昨晚 PR 列表整理成一份 Markdown" \
  --skill github-pr-workflow \
  --target email://me@example.com \
  --target file:///tmp/daily-pr.md

10.6 配置文件中的 cron

也可以纯 YAML:

cron:
  timezone: Asia/Shanghai
  jobs:
    - name: morning-brief
      schedule: "0 9 * * 1-5"
      prompt: |
        请扫一下昨晚(按 Asia/Shanghai 计算)的:
          - GitHub @myorg 的 open PR
          - HackerNews 前 5 条 AI 相关
          - X(Twitter) @AnthropicAI 最新 5 条
        汇总成 200 字以内的简报,附原文链接。
      skills:
        - blogwatcher
        - github-pr-workflow
      toolsets:
        - web
        - file
        - github-mcp
      targets:
        - telegram://1234567890
        - email://me@example.com
        - file:///home/me/briefs/{{date}}.md

{{date}} 是 Hermes 内置变量,cron 上下文里还能用 {{datetime}}{{job_name}}{{run_id}} 等。

10.7 失败重试与降级

cron:
  retries: 3
  retry_backoff_seconds: 60
  on_failure:
    deliver_to: telegram://12345    # 失败时单独发我
    skill: incident-summarizer

10.8 与 Webhook 的协作:事件触发 vs 时间触发

第九章介绍过 Webhook。Cron 是时间触发,Webhook 是事件触发——二者经常配合:

gateway:
  webhooks:
    - name: github-pr-opened
      path: /webhooks/github-pr
      secret_env: GITHUB_WEBHOOK_SECRET
      action:
        prompt: |
          PR {{ json.pull_request.number }} 已开启:{{ json.pull_request.title }}.
          请按 AGENTS.md 评审,给 reviewer 留 3-5 条建议。
        toolsets: [web, file, github-mcp]
        deliver_to: slack://eng-reviews

事件层负责"立刻有反应",cron 层负责"批量回顾 / 周期总结"。

10.9 Kanban:复杂多步流的"持久任务板"

delegate_task 适合"父代理同步等结果";cron 适合"我自己定时跑"。当你需要的是 跨多个代理、可恢复、可被人介入、跨数天/周 的工作流时,用 Kanban

/kanban
hermes kanban create --board ops "本周巡检:pg 慢查询 / nginx 错误率 / 磁盘"
hermes kanban list
hermes kanban claim <task-id> --as reviewer
hermes kanban complete <task-id>
hermes kanban block <task-id> --reason "等 ops 提供 db 凭据"

模型这一侧通过 kanban_* 工具读写:kanban_showkanban_completekanban_blockkanban_heartbeatkanban_commentkanban_createkanban_link

典型工作流:

  • dispatcher profile 把 epic 拆成 task;
  • researcher profile 拿一个 task 调研,附上结论;
  • writer profile 拿调研稿写成报告;
  • reviewer profile 评审,必要时把任务 block 给人;
  • 完成后 cron 触发 publisher profile 把成稿发邮件。

每个 profile 都是一个独立 Hermes 进程,共享 ~/.hermes/kanban.db。详见 user-guide/features/kanban.mdkanban-tutorial.md

10.10 自动化模板(开箱即用)

下面给一组日常很有用的模板,照抄即可。

10.10.1 每日早报(个人)

- name: daily-brief
  schedule: "0 8 * * *"
  prompt: |
    给我一份 200 字以内的早报:
      - 我关注的 GitHub PR/Issue 状态变化
      - HackerNews / Reddit r/MachineLearning 顶 5 条
      - 我订阅的 RSS(见 ~/.hermes/feeds.txt)新增 5 条
    最后用一句话挑出"今天最值得我做的一件事"。
  skills: [blogwatcher, github-pr-workflow]
  targets:
    - telegram://${MY_CHAT_ID}
    - file:///home/me/briefs/{{date}}.md

10.10.2 PR Review 机器人

Webhook 触发,配合 GitHub MCP:

gateway:
  webhooks:
    - name: pr-review
      path: /webhooks/pr-review
      secret_env: GITHUB_WEBHOOK_SECRET
      action:
        prompt: |
          PR #{{ json.pull_request.number }} ({{ json.pull_request.title }}) 在 {{ json.repository.full_name }} 已开启。
          按仓库根 AGENTS.md 的评审清单进行评审,输出:
            - 总体结论(approve / request_changes / comment)
            - 3-7 条具体建议
            - 任何安全 / 性能 / 可维护性的隐患
        toolsets: [web, file, github-mcp]
        deliver_to: slack://eng-reviews

10.10.3 服务器巡检

- name: server-health
  schedule: "*/15 * * * *"
  prompt: |
    用 ssh 连到 ops.example.com 检查:
      - df -h(>80% 报警)
      - 最近 200 条 nginx error.log(异常率 >0.5% 报警)
      - systemctl is-active myapp
    一切正常时**不发任何消息**;有异常时给出诊断与建议。
  toolsets: [terminal, file]
  targets:
    - telegram://${OPS_GROUP}

10.10.4 周度知识库整理

- name: weekly-knowledge
  schedule: "0 18 * * 5"
  prompt: |
    搜索本周(7 天内)我所有会话,挑出 5 条值得长期记住的经验或决定,
    以"标题 + 100 字摘要"的方式整理;
    然后调用 memory 工具决定哪些加入 MEMORY.md。
  toolsets: [session_search, memory, file]
  targets:
    - email://me@example.com

10.10.5 定时备份与同步

- name: backup-hermes-home
  schedule: "0 3 * * *"
  prompt: |
    用 rsync 把 ~/.hermes/{memories,skills,SOUL.md,config.yaml} 同步到 backup-server:/srv/hermes-backup/{{date}}/
    然后压缩为 tar.zst 并保留最近 14 天。
  toolsets: [terminal]
  targets:
    - file:///var/log/hermes-backup.log

10.10.6 IM 群定时播报

- name: standup-reminder
  schedule: "30 9 * * 1-5"
  prompt: |
    根据 Kanban 板上"今日待办"任务,给团队拼一段 Markdown 播报:
      - 每个人各自负责的任务(按 Kanban claim 字段)
      - 是否有 blocker
    最后 @ 每个有未完成任务的人。
  toolsets: [kanban, web]
  targets:
    - wecom://group:engineering

10.10.7 Web 监控 + 通知

- name: rss-watch
  schedule: "*/30 * * * *"
  prompt: |
    抓取 https://example.com/blog/feed.xml;与上次结果比对,
    如有新条目,把每条做 100 字总结后发 Telegram。
    把已知条目 ID 保存在 ~/.hermes/state/rss.json 里,避免重复推送。
  toolsets: [web, file]
  targets:
    - telegram://${MY_CHAT_ID}

10.11 Cron + Skills + Memory 的化学反应

把三件事打通会让 Hermes 真正有"工作员"的感觉:

  1. Skill 写"做某件事的 SOP";
  2. Cron 把 SOP 周期化;
  3. Memory 让每次执行都借鉴上次的教训。

例如"巡检"技能里加一段:

## Pitfalls
- 上次发现 80% 阈值会误报:临时容量峰值。改用"连续 3 次 >80%"再报警。

下一次巡检,这条经验会自然进入决策。运行多了,Memory 还会反馈到 cron prompt 上:"最近一周磁盘没问题,可减少巡检频率到每小时一次"——你只需点头同意。

10.12 安全与配额

cron 与 webhook 是"代理替你 24×7 干活"的入口,安全要点:

  1. 永远在 Docker / Daytona / Modal 后端跑非可信任务

  2. cron job 启用 --toolsets 只挑必要 toolset;

  3. approval.require_confirmation 锁住"破坏性操作",让 Agent 撞到时主动 DM 你;

  4. 给每个 job 设 max_runtime_seconds

    cron:
      defaults:
        max_runtime_seconds: 600
        max_iterations: 30
    
  5. 给 Provider 设月度预算告警(OpenRouter、Anthropic 都有),cron 跑飞了能及时止损。

10.13 排错

症状 排查
到点不跑 hermes gateway status cron 是否启用;cron.timezone 是否对;hermes cron list --verbose 看 next_run
跑了但什么也没发 投递目标没配;gateway logs 看出站日志
跑两次 多个 Hermes profile 共享同一份 cron 文件——切到不同 profile 或加锁
提示 "cron tool disabled" 你试图在 cron 内创建 cron——禁用是有意为之
Webhook 401 secret 校验失败;hash 算法对齐

10.14 本章小结

  • Cron + Skill + Memory + Webhook + Kanban 五件套构成 Hermes 的"自动化操作系统";
  • 自然语言、every 表达式、5 字段 cron、自然语言时间,全支持;
  • 投递目标可以是任意平台或本地文件;
  • Webhook 负责"事件触发",cron 负责"时间触发",Kanban 负责"跨代理、可恢复、长流程";
  • 安全上:默认沙箱、按平台收紧 toolset、审批列表、超时与预算上限。

下一章我们打开几扇"高级感"的窗户:语音、视觉、浏览器与子代理协作。