第 07 期 | Cron 调度与自动化任务编排
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 调度器被触发时,它会:
- 唤醒 Agent 核心:如果 Agent 处于空闲状态,它会被唤醒并加载必要的上下文。
- 注入任务指令:预设的 Prompt(指令)会被作为用户的输入,传递给 Agent 的大语言模型(LLM)。
- 智能决策与执行:LLM 会根据 Prompt、Agent 的 Skills(技能,详见第 03 期)和 Memory(记忆,详见第 04 期)来制定执行计划,调用所需的工具,并生成响应。
- 结果处理与反馈:任务执行的结果可以被记录到 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;- 调度器触发:根据 Cron 表达式,Hermes Agent 的内部调度器会在指定时间点触发任务。
- 状态检查:首先检查任务是否处于启用(Enabled)状态。如果被禁用,任务将被跳过。
- Agent 唤醒与上下文加载:Agent 核心被激活,加载与该任务相关的任何特定配置(如
--system-prompt,--model)以及其持久化记忆(Memory)。 - Prompt 处理:
--prompt中定义的指令被送入 LLM。LLM 会根据其知识、Skills 和 Memory 来理解任务意图。 - 技能调用与外部交互:如果任务需要与外部世界交互(如查询天气、发送邮件、执行代码),LLM 会决定调用相应的 Skills(如
web_search、send_email等)。 - 记忆更新:任务执行过程中产生的任何重要信息或决策,都会被 Agent 记录到其长期记忆中,以便未来的任务或用户查询能够利用。
- 生成输出:Agent 生成任务的最终结果,这可能是一段文本、一个报告摘要,或者一个特定操作的确认。
- 结果存储与日志:任务的执行结果和状态(成功、失败)会被记录下来,供用户通过
hermes logs或hermes doctor等命令查看。 - 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: "每小时使用
- 周期性系统健康检查:
- Prompt: "每天凌晨 3 点,使用
ssh_exec技能连接到prod-server-01并执行df -h和systemctl status nginx命令。分析输出结果,如果发现磁盘空间低于 10% 或 Nginx 服务未运行,请立即生成一份包含详细信息的告警报告,并记录到 Memory。" - 涉及技能:
ssh_exec(远程命令执行),text_analysis(文本分析,由 LLM 完成)。
- Prompt: "每天凌晨 3 点,使用
- 自动化内容发布:
- Prompt: "每周一早上 8 点,根据最近一周的科技新闻(从 Memory 获取),生成一篇关于未来科技趋势的短篇博客文章。使用
image_generation技能为文章生成一张配图。将文章和图片内容整合,并模拟发布到我的博客平台(假设有blog_post技能)。" - 涉及技能:
image_generation(图像生成),blog_post(发布文章,可能需要自定义 Skill)。
- Prompt: "每周一早上 8 点,根据最近一周的科技新闻(从 Memory 获取),生成一篇关于未来科技趋势的短篇博客文章。使用
通过这种方式,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 将摘要打印到控制台或日志中。
操作步骤:
确认 Hermes Agent 运行正常
首先,确保您的 Hermes Agent 已经安装并启动。如果您尚未安装,请参考第 01 期。
hermes doctor预期输出应显示 Agent 状态良好,模型已配置。
添加每日市场摘要 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。查看 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、名称、调度时间、状态、上次运行时间和下次运行时间。
(可选)禁用或删除任务
如果您想暂时停止任务,可以使用
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 的检查逻辑和结果判断。
操作步骤:
添加每小时健康检查 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>。查看 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(模拟)观察 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,结合其智能推理能力,生成一份结构化且有价值的报告。
删除任务
完成演示后,删除此任务:
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 |
📝 本期要点回顾
- Hermes Agent 的 Cron 调度是智能自动化的核心:它允许 Agent 按照预设的时间表,主动触发一个完整的“思考周期”,而不仅仅是执行简单的命令。
hermes cron命令集提供全面的任务管理:通过add,list,delete,enable,disable,edit等命令,用户可以方便地创建、查看和管理自动化任务。- Cron 表达式是定义调度时间的基础:掌握五个字段(分钟、小时、日期、月份、星期几)及特殊字符(
*,,,-,/,?)的使用,能够精确控制任务的执行频率。 - 自动化任务的强大源于与 Skills 和 Memory 的结合:精心设计的 Prompt 能够引导 Agent 调用外部 Skills(如
web_search,ssh_exec)获取信息或执行操作,并通过 Memory 维持任务的上下文和连续性,实现高度复杂的智能工作流。 - Agent 作为“永不休息的助手”:Cron 调度赋予了 Agent 持续运行、无人值守的能力,适用于定时汇报、数据采集、系统健康检查、内容生成等多种自动化场景,极大地提升了工作效率。
🔗 参考资料
- Hermes Agent 官方文档 - Cron 模块: https://hermes-agent.nousresearch.com/docs/modules/cron
- Hermes Agent 官方文档 - Skills 模块: https://hermes-agent.nousresearch.com/docs/modules/skills
- Hermes Agent 官方文档 - Memory 模块: https://hermes-agent.nousresearch.com/docs/modules/memory