【系列:手搓自主 AI Agent:Hermes 架构原理剖析 · 第 10 篇】
执行环境抽象与定时任务让命令在任意地方跑、让 Agent 在未来主动干活导读命令只能在本地跑Agent 只能被动响应本篇拆解 Hermes 阶段 3 收官两章用 snapshot 文件传递状态让命令在本地/Docker/SSH 任意环境执行用任务即消息机制让 Agent 到点自动开工。附完整代码与 9 个初学者常踩的坑。两个主动需求产品经理又来了。“能不能让 agent 在 Docker 容器里跑命令”“30 分钟后帮我看看部署成功没。”“每 2 小时查一下磁盘。”“工作日早上 9 点总结 git log。”前 9 篇我们手搓的 Hermes Agentterminal 工具只有 4 行subprocess.run直接在本地跑。定时任务完全没有——agent 只能被动等用户说话。本篇解决这两个问题命令在哪跑s14 执行环境抽象到点自己动s15 定时任务。这也是阶段 3 的最后一章。前半·执行环境if-else 会爆炸两个问题状态不连续 分支爆炸先看现状。s01-s11 的 terminal 工具长这样subprocess.run(command,shellTrue)每次调用都是全新的 bash 进程。cd /tmp之后下一条命令又回到默认目录。export FOObar之后下一条命令echo $FOO是空的。状态不连续。产品说支持 Docker你写ifbackenddocker:subprocess.run([docker,exec,...])elifbackendssh:subprocess.run([ssh,host,...])elifbackendk8s:...六个后端六个分支。每个分支还要处理状态传递、错误处理、超时控制。代码爆炸。而且状态问题更严重Docker 里cd了下一条命令又回到/。为什么不维护长驻 bash你可能会想那我不每次启动新 bash维护一个常驻进程不就行了三个坑等着你。坑一输出边界。没有分隔符你不知道哪段输出对应哪条命令。得手动塞echo __MARKER__做标记。坑二卡死传染。cat命令在等输入整个 bash 卡住。你想单独杀掉这条命令做不到——进程是同一个。坑三多行命令。for循环要等它执行完才知道什么时候读输出。你得懂 bash 语法才能判断现在该不该读。三个坑每一个都够你调一晚上。Hermes 方案snapshot 文件传递状态每条命令仍然启动新 bash但通过两个文件传递状态self._session_iduuid.uuid4().hex[:12]self._snapshot_pathf/tmp/hermes-snap-{self._session_id}.sh# 环境变量self._cwd_filef/tmp/hermes-cwd-{self._session_id}.txt# 工作目录核心是五行包装脚本source snapshot.sh ← 恢复上次保存的环境变量 cd {上次的工作目录} ← 恢复上次的目录 {用户的命令} ← 真正要执行的 export -p snapshot.sh ← 保存新的环境变量 pwd -P cwd.txt ← 保存新的工作目录每次执行完把新的状态存回文件。下一条命令启动时先恢复再执行。看真实代码_wrap_commanddef_wrap_command(self,command:str)-str:parts[]ifself._snapshot_ready:parts.append(fsource{self._snapshot_path}2/dev/null)parts.append(fcd{shlex.quote(self.cwd)}2/dev/null)parts.append(command)parts.append(f_exit$?; export -p {self._snapshot_path}2/dev/null; fpwd -P {self._cwd_file}2/dev/null; exit $_exit)return; .join(parts)注意_exit$?这个细节。先存退出码再保存 snapshot。如果顺序反了export -p的退出码永远是 0会覆盖用户命令的退出码。到时候你的 agent 执行ls /nonexist都返回成功。三种后端本地 / Docker / SSH基类叫BaseExecutionEnvironment注意不是文档里的 BaseEnvironment。子类只需实现_run_bash(cmd_string)和cleanup()。LocalBackend直接subprocess.Popen([bash, -c, cmd_string])。但有个关键细节——密钥过滤_SECRET_BLOCKLIST# 过滤 OPENAI_API_KEY 等防止 agent 执行env | grep KEY拿到你的 API key。Docker 和 SSH 后端不需要这个——容器和远程机器天然没有你的密钥。DockerBackend先docker run -d长驻容器sleep infinity每条命令docker exec。为什么要长驻因为 snapshot 文件在容器文件系统里。容器销毁snapshot 就丢了。安全参数是重点--cap-drop ALL # 防 mount / 改网络 --security-opt no-new-privileges # 防提权 --pids-limit 256 # 防 fork 炸弹 --memory 512m # 内存上限SSHBackendControlMasterautoControlPathControlPersist300。连接复用30 条命令不用 30 次握手。BatchModeyes不弹交互提示。一行配置切后端terminal:backend:docker# local / docker / ssh工具代码一行不用改。远程后端读 cwd 文件多一步docker exec cat/ssh cat仅此而已。教学边界这层只管 terminal 工具。read_file不走这层——它没有跨命令状态open(path)改docker exec cat path即可。过渡能跑了但只能被动响应执行环境搞定了。命令可以在任意地方跑状态连续切换后端一行配置。但 agent 还是只能被动响应。用户不说它不动。“30 分钟后帮我看看部署成功没”——30 分钟后谁来看后半·定时任务让 Agent 到点自己动核心洞察任务即消息三个需求——延时、间隔、cron——一个共同点在未来某个时间主动做事。Hermes 的方案定时任务不是新的执行路径。它只是一个会在未来某个时间假装用户说了句话的机制。从GatewayRunner往下全部复用。工具、错误恢复、权限、委派——都自动生效。看真实代码dataclassclassCronJob:job_id:strschedule:str# 30m / every 2h / 0 9 * * 1-5prompt:str# 触发时发给 agent 的消息session_key:strcreated_at:strnext_fire:floatone_shot:bool# True delete after firing到期后构造一个MessageEventtextjob.prompt,platformcron,chat_id原用户 session_key送进GatewayRunner._handle_message。三个好处全部能力免费复用——工具、错误恢复、权限、委派执行历史自动持久化——SQLite 记录回复自动路由回原平台——用户在哪聊的结果回哪去三种调度格式格式示例含义one_shot延时30m30 分钟后一次True间隔every 2h每 2 小时循环FalseCron0 9 * * 1-5工作日 9 点False为什么不只用 cron因为用户说30 分钟后的频率远高于设个 cron。延时格式一行搞定parse_schedule(30m)。parse_schedule逻辑every前缀 → 循环间隔裸时长 → 一次性延时否则 → cron 表达式。_UNITS{s:1,m:60,h:3600,d:86400}_next_cron_fire五字段从下一分钟逐分钟找最多 366 天。注意 Pythonweekday()0Mon vs cron 0Sun 的转换——这个坑踩的人最多。JobStorejobs.json 锁持久化用jobs.json不用 SQLite。任务少、人可读、不需要全文搜索。threading.Lock()# 主线程写 后台线程读get_due返回到期任务advanceone_shot 直接 pop循环任务重新parse_schedule。JobScheduler后台线程 30 秒扫一次daemonTrue# 后台线程whileTrue:forjobinget_due():fire(job)advance(job)time.sleep(30)cron_toolaction create/list/delete闭包绑定 store session_key。CLI 模式fire_callback直接调run_conversation()没有 Gateway 的场景。避坑9 个初学者常踩的坑两章合并精选每一个都是真实事故。执行环境 4 错忘了过滤 API key——agent 执行env | grep KEY直接拿到密钥Docker 不加资源限制——fork 炸弹 / 内存打爆宿主机SSH 每条命令建新连接——30 条命令 30 次握手慢到怀疑人生命令包装用串联——用户命令非零时 export 不执行snapshot 断掉定时任务 5 错在主线程检查定时任务——input()阻塞定时任务永远不触发忘了加锁——字典遍历时大小改变RuntimeError一次性任务不删除——30 秒后又触发重复执行cron 星期几搞错——Python 0Mon vs cron 0Sun差一天没处理 jobs.json 损坏——原子写 JSONDecodeError降级阶段 3 收官多平台接收s12-s13 跨环境执行s14 定时主动做事s15。你的 agent 现在能接住任何平台的任何消息在任意环境执行命令到点自己开工。阶段 4 开始高级能力MCP、浏览器、语音视觉。下一篇第 11 篇拆解高级能力扩展继续关注。你在做定时任务时踩过哪个坑欢迎留言交流。参考文献Hermes Agent 教学仓库agents/s14_terminal_backends.py本文代码素材72864 字节真实可运行Hermes Agent 教学仓库agents/s15_scheduled_tasks.py本文代码素材90769 字节真实可运行Hermes Agent 教学仓库docs/zh/s14-terminal-backends.md与docs/zh/s15-scheduled-tasks.mdsnapshot 机制、任务即消息详解源码获取如需本系列全部源码请在以下链接克隆https://gitcode.com/ganxin7932508/learn-hermes-agent.git

相关新闻

放大器输出端莫名其妙多了一个正弦波?运放自激振荡的排查与修复

放大器输出端莫名其妙多了一个正弦波?运放自激振荡的排查与修复

工业现场的变送器,有时明明输入端没信号,输出端却测到了一个几十kHz的“小正弦波”;换了运放,没用;换了PCB板子,好一阵又犯。其实这是一个经典的问题——运放自激振荡。这种故障最烦人的地方在于&#xff1…

2026/8/15 1:47:00 阅读更多 →
乱码退散!用 Locale Emulator 做区域语言模拟,5 步告别改系统重启

乱码退散!用 Locale Emulator 做区域语言模拟,5 步告别改系统重启

乱码退散!用 Locale Emulator 做区域语言模拟,5 步告别改系统重启 【免费下载链接】Locale-Emulator Yet Another System Region and Language Simulator 项目地址: https://gitcode.com/gh_mirrors/lo/Locale-Emulator 深夜两点,你终…

2026/8/15 1:46:00 阅读更多 →
Linux邮件发送终极指南:Postfix配置与mail命令实战

Linux邮件发送终极指南:Postfix配置与mail命令实战

1. 项目概述与核心价值在Linux服务器运维、自动化脚本开发或者日常的系统监控告警场景里,邮件通知是一个绕不开的刚需。你可能需要让Crontab定时任务在失败时给你发个提醒,或者让Zabbix监控到服务器异常时第一时间推送告警,又或者自己写了个爬…

2026/8/15 1:46:00 阅读更多 →

最新新闻

数组插入操作:尾部追加与任意位置插入的性能差异与选型策略

数组插入操作:尾部追加与任意位置插入的性能差异与选型策略

1. 数组插入操作的核心价值与场景剖析在编程世界里,数组(Array)绝对算得上是元老级的数据结构。无论你用的是Python、JavaScript、Java还是C,数组都是你绕不开的基础。很多新手朋友可能会觉得,往数组里加个元素&#x…

2026/8/15 2:32:12 阅读更多 →
Ling-3.0-tiny轻量模型部署实战:从环境配置到API服务化

Ling-3.0-tiny轻量模型部署实战:从环境配置到API服务化

1. 先搞清楚 Ling-3.0-tiny 到底解决了什么问题如果你最近在关注轻量级、能快速部署的AI模型,特别是来自大厂的开源项目,那么蚂蚁百灵(Ant Group)发布的 Ling-3.0-tiny 模型绝对值得你花时间了解一下。它不是一个功能庞杂的“巨无…

2026/8/15 2:32:12 阅读更多 →
PyTorch时序预测实战:从数据到模型的气温预测完整指南

PyTorch时序预测实战:从数据到模型的气温预测完整指南

这次我们来看一个基于 PyTorch 的气温预测实战项目。对于正在寻找毕业设计课题、希望快速入门深度学习应用的同学来说,这是一个非常直接且实用的切入点。项目核心是利用 PyTorch 框架,构建一个神经网络模型,根据历史气象数据来预测未来的气温…

2026/8/15 2:32:12 阅读更多 →
基于OpenClaw框架部署私有化AI助理:从架构解析到钉钉集成实战

基于OpenClaw框架部署私有化AI助理:从架构解析到钉钉集成实战

1. 从“玩具”到“生产力”:为什么你需要一个自己的AI助理 最近两年,AI大模型的热度居高不下,从ChatGPT到Claude,再到国内各种大厂模型,功能确实强大。但不知道你有没有这种感觉:每次想用AI处理点工作&…

2026/8/15 2:32:12 阅读更多 →
异构AI Agent框架集成实战:Hermes与OpenClaw协同架构设计与实现

异构AI Agent框架集成实战:Hermes与OpenClaw协同架构设计与实现

1. 项目概述:当AI Agent遇上“我全都要”在AI技术快速迭代的今天,开发者们常常面临一个幸福的烦恼:面对层出不穷的优秀开源框架,到底该选哪一个?是选择功能全面、生态成熟的“老牌劲旅”,还是拥抱设计新颖、…

2026/8/15 2:32:12 阅读更多 →
用OpenGlass把普通眼镜改造成AI智能眼镜:从零到能用的完整路线图

用OpenGlass把普通眼镜改造成AI智能眼镜:从零到能用的完整路线图

用OpenGlass把普通眼镜改造成AI智能眼镜:从零到能用的完整路线图 【免费下载链接】OpenGlass Turn any glasses into AI-powered smart glasses 项目地址: https://gitcode.com/GitHub_Trending/op/OpenGlass 25美元硬件 半小时配置,让一副普通眼…

2026/8/15 2:31:11 阅读更多 →

日新闻

内景 空间站内部 中国空间站 太空 内仓

内景 空间站内部 中国空间站 太空 内仓

本项目为前几天收费帮学妹做的一个项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。 一、项目描述 空间站内部 中国空间站 太空 内仓 地址:本地PC端运行(或Web…

2026/8/15 0:00:30 阅读更多 →
重新定义数据接口:3个突破性场景让通达信数据读取更智能

重新定义数据接口:3个突破性场景让通达信数据读取更智能

重新定义数据接口:3个突破性场景让通达信数据读取更智能 【免费下载链接】mootdx 通达信数据读取的一个简便使用封装 项目地址: https://gitcode.com/GitHub_Trending/mo/mootdx 当我们面对海量金融数据时,传统的数据获取方式往往让我们陷入困境—…

2026/8/15 0:00:30 阅读更多 →
一文读懂快消WMS怎么选?2026年国内外10大主流WMS品牌盘点

一文读懂快消WMS怎么选?2026年国内外10大主流WMS品牌盘点

快消品(FMCG)是流通速度较快、竞争较为激烈的行业之一。一瓶饮料从出厂到消费者手中,往往只有几十天甚至几天的周转窗口。这决定了快消行业的仓储管理系统(WMS)与制造业、电商行业存在明显区别:它不仅需要管…

2026/8/15 0:02:30 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/13 2:38:34 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/13 10:41:52 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/13 10:41:51 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/14 13:40:53 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/14 14:06:45 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/13 10:41:49 阅读更多 →