第 07 期 | Cron 调度与自动化任务编排

更新于 2026/4/15

Hermes Agent 教程系列

副标题:使用 hermes cron 设置周期性自动化任务——定时汇报、数据采集、健康检查。深入理解 Agent 作为"永不休息的助手"的运行模式与资源管理。


🎯 学习目标

  • 掌握 Hermes Agent 的 Cron 调度机制:理解 Agent 如何利用 Cron 实现周期性、智能化的任务执行。
  • 熟练运用 hermes cron 命令集:学会添加、列出、编辑、删除、启用和禁用自动化任务。
  • 设计并编排复杂的自动化工作流:将 Cron 调度与 Agent 的 Skills(技能)和 Memory(记忆)系统相结合,实现高级自动化场景。
  • 理解 Agent 自动化任务的运行模式与资源管理:探讨 Agent 在无人值守状态下如何高效、负责地执行任务。

📖 核心概念讲解

Hermes Agent 的核心理念之一是成为一个“永不休息的助手”。为了实现这一目标,仅仅能够响应用户指令是不够的,它还需要具备主动执行任务的能力。Cron 调度正是赋予 Agent 这种能力的关键组件,它让 Agent 能够按照预设的时间表,独立地启动思考、执行操作,并将结果反馈给用户或存储起来。

7.1 Cron 调度:Agent 的“生物钟”

在传统的 Unix-like 系统中,cron 是一个守护进程,用于在预定的时间、日期或间隔执行命令或脚本。它就像一个精密的“生物钟”,确保系统维护任务、数据备份等能够按时自动运行。Hermes Agent 将这一概念提升到了一个新的高度,它不仅仅是执行一条简单的 shell 命令,而是触发 Agent 的一个完整“思考周期”。

当 Hermes Agent 的 Cron 调度器被触发时,它会:

  1. 唤醒 Agent 核心:如果 Agent 处于空闲状态,它会被唤醒并加载必要的上下文。
  2. 注入任务指令:预设的 Prompt(指令)会被作为用户的输入,传递给 Agent 的大语言模型(LLM)。
  3. 智能决策与执行:LLM 会根据 Prompt、Agent 的 Skills(技能,详见第 03 期)和 Memory(记忆,详见第 04 期)来制定执行计划,调用所需的工具,并生成响应。
  4. 结果处理与反馈:任务执行的结果可以被记录到 Agent 的 Memory 中,或者通过消息网关(详见第 05 期)发送给用户。

这种智能化的 Cron 调度,让 Agent 能够:

  • 定时汇报与总结:每天早上生成最新的市场分析、项目进度报告或新闻摘要。
  • 周期性数据采集:每小时抓取股票价格、天气数据或网站更新,并进行处理。
  • 系统健康检查与监控:定时检查服务器状态、服务可用性,并在发现异常时发出警报。
  • 自动化内容生成:按计划生成社交媒体帖子、邮件草稿或博客文章。

Cron 表达式基础

Cron 任务的调度时间通过 Cron 表达式定义。一个标准的 Cron 表达式由五个字段组成,分别代表:分钟、小时、日期、月份、星期几。

字段 允许值 说明
分钟 0-59
小时 0-23 (0 表示午夜)
日期 1-31
月份 1-12
星期几 0-7 (0 和 7 都表示星期日,1 表示星期一)

特殊字符:

  • *:匹配任何值,表示“每”。例如,分钟字段为 * 表示每分钟。
  • ,:列出多个值。例如,1,5 表示第 1 和第 5。
  • -:指定范围。例如,9-17 表示上午 9 点到下午 5 点。
  • /:指定增量。例如,*/5 在分钟字段表示每 5 分钟。
  • ?:仅用于日期和星期几字段,表示不指定特定值,常用于避免冲突。

常见 Cron 表达式示例:

表达式 含义
0 0 * * * 每天午夜 00:00 执行
0 9 * * * 每天早上 9:00 执行
*/30 * * * * 每 30 分钟执行一次
0 0 1 * * 每月 1 号午夜 00:00 执行
0 12 * * 1-5 每周一到周五中午 12:00 执行

理解 Cron 表达式是配置自动化任务的基础。Hermes Agent 的 Cron 调度功能,结合其智能决策能力,将传统的定时任务提升到了一个全新的智能自动化水平。

7.2 hermes cron 命令详解与任务生命周期

hermes cron 命令是管理 Hermes Agent 自动化任务的核心工具集。它提供了直观的接口来添加、查看、编辑和删除定时任务。

任务管理命令概览

  • hermes cron add: 添加新的 Cron 任务。
  • hermes cron list: 列出所有已配置的 Cron 任务。
  • hermes cron delete <task_id>: 删除指定的 Cron 任务。
  • hermes cron enable <task_id>: 启用指定的 Cron 任务。
  • hermes cron disable <task_id>: 禁用指定的 Cron 任务。
  • hermes cron edit <task_id>: 编辑指定的 Cron 任务的属性。

hermes cron add 详细说明

这是最常用的命令,用于创建一个新的自动化任务。

hermes cron add \
  --name "任务名称" \
  --schedule "cron_表达式" \
  --prompt "给 Agent 的指令" \
  [--system-prompt "可选的系统指令"] \
  [--model "可选的 LLM 模型名称"]
  • --name: 任务的唯一标识符,便于识别和管理。
  • --schedule: Cron 表达式,定义任务的执行频率和时间。
  • --prompt: 这是 Agent 在任务被触发时接收到的核心指令。你需要在这里清晰地描述 Agent 需要完成的任务。
  • --system-prompt (可选): 允许为该特定 Cron 任务设置一个独立的系统 Prompt,覆盖 Agent 的默认系统 Prompt。这对于需要特定角色或行为的自动化任务非常有用。
  • --model (可选): 允许为该特定 Cron 任务指定一个 LLM 模型,覆盖 Agent 的默认模型配置。这在某些任务需要特定模型能力(例如,更长的上下文窗口、更强的推理能力)时非常有用。

任务的执行流程与状态

当一个 Cron 任务被调度执行时,其生命周期大致如下:

graph TD
    A[Cron Scheduler Triggered] --> B{Is Task Enabled?};
    B -- Yes --> C[Hermes Agent Wakes Up];
    C --> D[Load Task Context & Prompt];
    D --> E[LLM Processes Prompt & Decides Actions];
    E --> F{Utilize Skills/Tools?};
    F -- Yes --> G[Agent Calls External Skills];
    G --> H[Update Internal State/Memory];
    H --> I[Generate Final Response/Output];
    I --> J[Store Task Execution Result];
    J --> K[Log Event & Go Dormant];
    B -- No --> K;
  1. 调度器触发:根据 Cron 表达式,Hermes Agent 的内部调度器会在指定时间点触发任务。
  2. 状态检查:首先检查任务是否处于启用(Enabled)状态。如果被禁用,任务将被跳过。
  3. Agent 唤醒与上下文加载:Agent 核心被激活,加载与该任务相关的任何特定配置(如 --system-prompt, --model)以及其持久化记忆(Memory)。
  4. Prompt 处理--prompt 中定义的指令被送入 LLM。LLM 会根据其知识、Skills 和 Memory 来理解任务意图。
  5. 技能调用与外部交互:如果任务需要与外部世界交互(如查询天气、发送邮件、执行代码),LLM 会决定调用相应的 Skills(如 web_searchsend_email 等)。
  6. 记忆更新:任务执行过程中产生的任何重要信息或决策,都会被 Agent 记录到其长期记忆中,以便未来的任务或用户查询能够利用。
  7. 生成输出:Agent 生成任务的最终结果,这可能是一段文本、一个报告摘要,或者一个特定操作的确认。
  8. 结果存储与日志:任务的执行结果和状态(成功、失败)会被记录下来,供用户通过 hermes logshermes doctor 等命令查看。
  9. Agent 再次休眠:任务完成后,Agent 会释放资源并进入休眠状态,等待下一次触发。

这种精细的任务生命周期管理,确保了每一个自动化任务都能在 Agent 的完整能力框架下运行,而不仅仅是简单的脚本执行。它让 Agent 能够像一个真正的智能助手一样,理解、执行并学习。

7.3 自动化任务编排策略:结合 Skills 与 Memory

Hermes Agent 的强大之处在于其模块化和自进化能力。Cron 调度作为触发器,其真正价值在于能够与 Agent 的 Skills(技能)和 Memory(记忆)系统深度集成,从而编排出高度智能和复杂的自动化工作流。

1. 编写高效的 Prompt

一个好的 Prompt 是自动化任务成功的基石。对于 Cron 任务,Prompt 不仅仅是简单的指令,它更像是一份任务说明书,需要清晰、明确地引导 Agent 完成以下几点:

  • 明确任务目标:Agent 最终需要达成什么?例如:“生成每日市场摘要”、“检查系统健康状况”。
  • 指定信息来源:如果需要外部信息,Agent 应该从哪里获取?例如:“使用 web_search 技能搜索最新财经新闻”、“从文件系统读取 server_status.log”。
  • 定义处理逻辑:Agent 应该如何处理获取到的信息?例如:“筛选出与科技股相关的新闻”、“识别日志中的错误和警告信息”。
  • 明确输出格式和目的地:结果应该以什么形式呈现?发送到哪里?例如:“以 Markdown 格式输出摘要,并模拟发送给我”、“如果发现异常,则生成一份详细报告”。
  • 考虑异常情况:当遇到问题时,Agent 应该如何响应?例如:“如果无法获取数据,请报告错误并说明原因”。

示例 Prompt 片段:

"你是一名专业的金融分析师。请使用你的 `web_search` 技能获取今天最新的全球股市新闻和主要经济指标。然后,根据这些信息,生成一份简洁的每日市场摘要报告,重点关注对科技行业的潜在影响。报告应包含标题、关键要点和简要分析。最后,模拟将这份报告发送给我。"

这个 Prompt 明确了 Agent 的角色、所需技能、处理步骤、输出格式和最终交付方式。

2. 与 Skills(技能)的深度集成

第 03 期所述,Skills 是 Agent 与外部世界交互的桥梁。Cron 任务可以触发 Agent 使用一个或多个 Skills 来完成复杂操作,从而超越 LLM 自身的知识限制。

集成场景举例:

  • 定时数据采集与分析
    • Prompt: "每小时使用 web_search 技能抓取特定网站的最新文章标题,并用 text_summarize 技能对每篇文章生成一个简短概述。将结果汇总成一个列表,并记录到我的 Memory 中。"
    • 涉及技能: web_search (网页抓取), text_summarize (文本摘要)。
  • 周期性系统健康检查
    • Prompt: "每天凌晨 3 点,使用 ssh_exec 技能连接到 prod-server-01 并执行 df -hsystemctl status nginx 命令。分析输出结果,如果发现磁盘空间低于 10% 或 Nginx 服务未运行,请立即生成一份包含详细信息的告警报告,并记录到 Memory。"
    • 涉及技能: ssh_exec (远程命令执行), text_analysis (文本分析,由 LLM 完成)。
  • 自动化内容发布
    • Prompt: "每周一早上 8 点,根据最近一周的科技新闻(从 Memory 获取),生成一篇关于未来科技趋势的短篇博客文章。使用 image_generation 技能为文章生成一张配图。将文章和图片内容整合,并模拟发布到我的博客平台(假设有 blog_post 技能)。"
    • 涉及技能: image_generation (图像生成), blog_post (发布文章,可能需要自定义 Skill)。

通过这种方式,Cron 任务不再是被动的定时执行,而是成为一个智能工作流的启动器,驱动 Agent 利用其全部能力来完成任务。

3. 利用 Memory(记忆)保持任务上下文与连续性

第 04 期详细介绍了 Hermes Agent 的持久化记忆系统。对于自动化任务而言,Memory 至关重要,它赋予了 Agent 跨会话、跨任务的连续性,使得自动化任务能够基于历史信息进行决策和演进。

利用 Memory 的策略:

  • 维护任务状态:将自动化任务的最新状态、上次执行结果、遇到的问题等信息存储在 Memory 中。例如,一个数据采集任务可以记录上次采集到的最新数据 ID,下次启动时从该 ID 继续。
  • 累积知识与上下文:Agent 可以将周期性任务中收集到的数据、分析结果等累积到 Memory 中,形成一个逐步增长的知识库。后续的任务可以查询这些历史数据进行更深层次的分析。
  • 避免重复与优化决策:通过检查 Memory,Agent 可以避免执行重复的操作,或者根据历史经验调整其行为。例如,如果 Memory 显示某个系统组件已经多次出现故障,Agent 可能会在下次检查时更加关注它,甚至主动建议采取预防措施。
  • 生成基于历史的报告:Cron 任务可以被指示“根据过去一周的系统健康检查记录(从 Memory 获取),生成一份趋势分析报告”。

示例 Prompt 片段与 Memory 交互:

"你是一名系统管理员助手。每天凌晨 2 点,请检查所有关键服务器的 CPU 使用率和内存占用情况。如果任何服务器的 CPU 使用率连续两次超过 80% 或内存占用超过 90%,请生成一份详细的告警报告,并将其记录到我的 Memory 中。每次检查后,请更新 Memory 中关于服务器健康状况的最新记录。"

在这个例子中,Agent 不仅执行单次检查,它还会利用 Memory 来跟踪历史数据,从而做出更智能的告警决策。

资源管理与错误处理

  • 资源消耗:频繁或复杂的 Cron 任务会增加 LLM API 调用量,从而产生费用。同时,频繁的工具调用也会占用系统资源。在设计自动化任务时,需要平衡任务的频率和复杂度与资源消耗。
  • 错误处理:虽然 Hermes Agent 能够自我修复和重试,但在自动化任务中,明确的错误报告机制仍然很重要。在 Prompt 中可以加入“如果任务失败或遇到任何错误,请详细说明并通知我”的指令。结合第 05 期的消息网关,Agent 可以在任务失败时通过 Telegram 或 Discord 发送通知。

通过将 Cron 调度与 Agent 的智能核心、外部技能和持久记忆相结合,Hermes Agent 能够超越简单的定时任务,成为一个真正意义上的“永不休息的智能助手”,为用户提供持续的价值。


💻 实战演示

在本节中,我们将通过几个实战场景,演示如何使用 hermes cron 命令来配置和管理自动化任务。

实战场景一:定时生成并模拟发送每日市场摘要

我们将设置一个 Cron 任务,让 Agent 每天早上 9 点自动生成一份基于最新信息的市场摘要。为了简化演示,我们暂时不涉及实际的发送功能(这需要配置消息网关,详见第 05 期),而是让 Agent 将摘要打印到控制台或日志中。

操作步骤:

  1. 确认 Hermes Agent 运行正常

    首先,确保您的 Hermes Agent 已经安装并启动。如果您尚未安装,请参考第 01 期

    hermes doctor
    

    预期输出应显示 Agent 状态良好,模型已配置。

  2. 添加每日市场摘要 Cron 任务

    我们将添加一个名为 "Daily Market Summary" 的任务,每天早上 9 点触发。Agent 会被指示去搜索最新市场新闻,并生成一份摘要。

    hermes cron add \
      --name "Daily Market Summary" \
      --schedule "0 9 * * *" \
      --prompt "你是一名专业的金融分析师。请使用你的 web_search 技能获取今天最新的全球股市新闻和主要经济指标。然后,根据这些信息,生成一份简洁的每日市场摘要报告,重点关注对科技行业的潜在影响。报告应包含标题、关键要点和简要分析。最后,模拟将这份报告发送给我,请将最终报告内容直接输出。"
    
    • --name "Daily Market Summary":任务名称。
    • --schedule "0 9 * * *":每天早上 9:00 执行。
    • --prompt "...":给 Agent 的具体指令。这里我们明确要求使用 web_search 技能,并指定了输出格式。

    预期输出:

    Cron job 'Daily Market Summary' added successfully with ID: <some-uuid>
    

    请记下 <some-uuid>,这是任务的唯一 ID。

  3. 查看 Cron 任务列表

    hermes cron list
    

    预期输出(类似):

    ID                                    Name                   Schedule    Status    Last Run               Next Run
    ------------------------------------  ---------------------  ----------  --------  ---------------------  ---------------------
    <some-uuid>                           Daily Market Summary   0 9 * * *   Enabled   Never                  YYYY-MM-DD 09:00:00
    

    您可以看到任务的 ID、名称、调度时间、状态、上次运行时间和下次运行时间。

  4. (可选)禁用或删除任务

    如果您想暂时停止任务,可以使用 disable 命令:

    hermes cron disable <some-uuid>
    

    预期输出:

    Cron job <some-uuid> disabled successfully.
    

    再次查看列表,状态将变为 Disabled

    hermes cron list
    

    输出:

    ID                                    Name                   Schedule    Status     Last Run               Next Run
    ------------------------------------  ---------------------  ----------  ---------  ---------------------  ---------------------
    <some-uuid>                           Daily Market Summary   0 9 * * *   Disabled   Never                  YYYY-MM-DD 09:00:00
    

    要重新启用,使用 enable 命令:

    hermes cron enable <some-uuid>
    

    预期输出:

    Cron job <some-uuid> enabled successfully.
    

    完成演示后,为了避免不必要的触发,我们删除此任务:

    hermes cron delete <some-uuid>
    

    预期输出:

    Cron job <some-uuid> deleted successfully.
    

实战场景二:周期性系统健康检查与异常报告(模拟)

在这个场景中,我们将设置一个每小时运行一次的 Cron 任务,模拟 Agent 检查系统健康状况。如果 Agent 在检查中“发现”异常,它将生成一份报告。由于我们没有真实的系统监控 Skill,我们将通过 Prompt 来模拟 Agent 的检查逻辑和结果判断。

操作步骤:

  1. 添加每小时健康检查 Cron 任务

    我们将创建一个名为 "Hourly System Health Check" 的任务,每小时执行一次。Prompt 将引导 Agent 模拟检查,并根据模拟结果生成报告。

    hermes cron add \
      --name "Hourly System Health Check" \
      --schedule "0 * * * *" \
      --prompt "你是一名系统健康监控助手。每小时,请模拟执行一次系统健康检查。在检查中,假设你发现 'Web Server (Nginx) 服务已停止'。请立即生成一份详细的告警报告,说明问题、可能原因和初步建议。报告应包含标题、发现问题、严重性(高)、可能原因、初步建议。将报告内容直接输出。"
    
    • --name "Hourly System Health Check":任务名称。
    • --schedule "0 * * * *":每小时的第 0 分钟执行一次。
    • --prompt "...":模拟 Agent 发现问题并生成报告。

    预期输出:

    Cron job 'Hourly System Health Check' added successfully with ID: <another-uuid>
    

    记下 <another-uuid>

  2. 查看 Cron 任务列表

    hermes cron list
    

    预期输出(类似):

    ID                                    Name                           Schedule    Status    Last Run               Next Run
    ------------------------------------  -----------------------------  ----------  --------  ---------------------  ---------------------
    <another-uuid>                        Hourly System Health Check     0 * * * *   Enabled   Never                  YYYY-MM-DD HH:00:00
    
  3. (模拟)观察 Agent 执行任务并输出结果

    由于 Cron 任务是定时触发的,我们无法立即看到输出。但在实际运行时,当达到调度时间点时,Hermes Agent 将被激活,并根据 Prompt 进行思考和生成内容。您可以通过观察 Agent 的运行日志或等待下次触发时间。

    如果 Agent 正常启动并处理了该 Cron 任务,您将在 Agent 的运行日志中看到类似以下内容的输出(这取决于您的 Agent 配置和 LLM 模型行为):

    [AGENT] Received cron task 'Hourly System Health Check' with prompt: "你是一名系统健康监控助手。每小时,请模拟执行一次系统健康检查。在检查中,假设你发现 'Web Server (Nginx) 服务已停止'。请立即生成一份详细的告警报告,说明问题、可能原因和初步建议。报告应包含标题、发现问题、严重性(高)、可能原因、初步建议。将报告内容直接输出。"
    
    [LLM] Thinking...
    
    [LLM] Tool Call: None (Agent directly generates the report based on the simulated scenario in the prompt)
    
    [AGENT] Output:
    # 系统健康告警报告
    
    **发现问题:** Web Server (Nginx) 服务已停止
    
    **严重性:** 高
    
    **可能原因:**
    *   Nginx 配置文件错误导致启动失败。
    *   服务器资源不足(内存、CPU)。
    *   端口冲突。
    *   系统更新或软件包冲突。
    *   意外的服务崩溃。
    
    **初步建议:**
    1.  **检查 Nginx 服务状态:** 尝试使用 `sudo systemctl status nginx` 命令确认服务状态。
    2.  **查看 Nginx 错误日志:** 检查 `/var/log/nginx/error.log` 文件,查找详细的错误信息。
    3.  **尝试重启服务:** 使用 `sudo systemctl restart nginx` 尝试重启 Nginx 服务。
    4.  **检查系统资源:** 确认服务器的内存和 CPU 使用情况是否正常。
    
    请尽快处理此问题,以恢复网站服务。
    

    这展示了 Agent 如何根据 Cron 任务的 Prompt,结合其智能推理能力,生成一份结构化且有价值的报告。

  4. 删除任务

    完成演示后,删除此任务:

    hermes cron delete <another-uuid>
    

    预期输出:

    Cron job <another-uuid> deleted successfully.
    

通过这两个实战场景,您应该对如何使用 hermes cron 命令来设置和管理自动化任务有了清晰的理解。结合 Agent 的 Skills 和 Memory,您可以构建出更加强大和智能的自动化工作流。


🔧 涉及的命令与工具

命令 描述 示例
hermes cron add 添加一个新的 Cron 调度任务。需要指定任务名称、Cron 表达式和给 Agent 的 Prompt。 hermes cron add --name "Daily Report" --schedule "0 9 * * *" --prompt "Generate a daily summary."
--name (参数) 任务的名称,用于识别和管理。 --name "Hourly Check"
--schedule (参数) Cron 表达式,定义任务的执行时间。 --schedule "*/15 * * * *" (每 15 分钟)
--prompt (参数) Agent 在任务被触发时接收到的指令。 --prompt "Find latest news about AI and summarize it."
--system-prompt (参数,可选) 为该特定 Cron 任务设置一个独立的系统 Prompt,覆盖 Agent 的默认系统 Prompt。 --system-prompt "You are a stoic philosopher."
--model (参数,可选) 为该特定 Cron 任务指定一个 LLM 模型,覆盖 Agent 的默认模型配置。 --model "gpt-4-turbo"
hermes cron list 列出所有已配置的 Cron 任务,显示它们的 ID、名称、调度、状态、上次运行时间和下次运行时间。 hermes cron list
hermes cron delete 根据任务 ID 删除指定的 Cron 任务。 hermes cron delete <task_id>
hermes cron enable 根据任务 ID 启用(恢复)指定的 Cron 任务。 hermes cron enable <task_id>
hermes cron disable 根据任务 ID 禁用(暂停)指定的 Cron 任务。 hermes cron disable <task_id>
hermes cron edit 根据任务 ID 编辑指定的 Cron 任务的名称、调度或 Prompt。 hermes cron edit <task_id> --schedule "0 10 * * *" --prompt "Generate a new report."
hermes doctor 检查 Hermes Agent 的整体运行状态,包括是否正在运行、模型配置等,有助于诊断 Cron 任务的运行环境。 hermes doctor

📝 本期要点回顾

  1. Hermes Agent 的 Cron 调度是智能自动化的核心:它允许 Agent 按照预设的时间表,主动触发一个完整的“思考周期”,而不仅仅是执行简单的命令。
  2. hermes cron 命令集提供全面的任务管理:通过 add, list, delete, enable, disable, edit 等命令,用户可以方便地创建、查看和管理自动化任务。
  3. Cron 表达式是定义调度时间的基础:掌握五个字段(分钟、小时、日期、月份、星期几)及特殊字符(*, ,, -, /, ?)的使用,能够精确控制任务的执行频率。
  4. 自动化任务的强大源于与 Skills 和 Memory 的结合:精心设计的 Prompt 能够引导 Agent 调用外部 Skills(如 web_search, ssh_exec)获取信息或执行操作,并通过 Memory 维持任务的上下文和连续性,实现高度复杂的智能工作流。
  5. Agent 作为“永不休息的助手”:Cron 调度赋予了 Agent 持续运行、无人值守的能力,适用于定时汇报、数据采集、系统健康检查、内容生成等多种自动化场景,极大地提升了工作效率。

🔗 参考资料