注:服务器部署Hermes超详细指南,由于过于详细,所以分为三部分;结尾有踩坑点说明。

Hermes Agent 云服务器部署(一):基础环境、Docker 镜像、目录挂载与模型配置
Hermes Agent 云服务器部署(二):微信 Weixin Gateway 与 Docker Compose 常驻运行
Hermes Agent 云服务器部署(三):面试题库、Cron 定时任务与故障排查

本笔记记录 Hermes Agent 在微信可聊天之后,如何灵活使用,以“面试题库 + 定时抽题 + 微信推送”为例。
同时记录本次部署过程中遇到的 cron、文件读取、脚本缺失、微信投递、用户授权等问题。

前提:

  • Hermes Agent Docker 镜像已成功运行
  • 微信 Weixin Gateway 已经能回复消息
  • /status 可用
  • /sethome 已成功设置当前微信私聊为 home channel
  • Hermes 数据目录为 /root/.hermes
  • 容器内数据目录为 /opt/data

1. 本阶段目标

本阶段目标是让 Hermes Agent 定时从面试题文件中抽题,并通过微信发给我。

期望效果:

每隔一小时,Hermes 自动读取我的面试题文件,
随机抽一道我已看过的面试题,
通过微信发给我复习,
只发题目,不直接发答案。

后续也可以扩展为:

每天早上 9 点抽 3 道题
晚上 9 点复盘
根据我的回答进行批改
追问薄弱知识点

2. 面试题文件应该放在哪里

服务器宿主机上创建目录:

mkdir -p /root/.hermes/interview

命令解释

mkdir

创建目录。

-p

如果父目录不存在,就一起创建;如果目录已存在,也不会报错。

/root/.hermes/interview

这是宿主机上的面试题目录。


3. 为什么宿主机是 /root/.hermes/interview,Hermes 却读取 /opt/data/interview

这是 Docker volume 映射导致的。

在 Docker Compose 文件中有:

volumes:
  - /root/.hermes:/opt/data

含义是:

宿主机路径:/root/.hermes
容器内路径:/opt/data

所以:

宿主机路径 容器内路径
/root/.hermes /opt/data
/root/.hermes/interview /opt/data/interview
/root/.hermes/interview/questions.md /opt/data/interview/questions.md
/root/.hermes/interview/xxx.txt /opt/data/interview/xxx.txt

重要结论

在 SSH 里创建、编辑、上传文件时,用:

/root/.hermes/interview

在 Hermes 的提示词、cron 任务、微信任务要求里,让它读取:

/opt/data/interview

这是正确的。


4. 创建一个简单的面试题文件

可以先创建一个 Markdown 文件测试:

cat > /root/.hermes/interview/questions.md <<'EOF'
# 已看过的面试题

## Java
- 题目:HashMap 1.7 和 1.8 的主要区别?
  答案要点:数组+链表/红黑树、头插/尾插、扩容机制、并发风险。

- 题目:synchronized 和 ReentrantLock 的区别?
  答案要点:可重入、公平锁、条件队列、可中断、锁释放、实现机制。

## MySQL
- 题目:B+ 树索引为什么适合数据库?
  答案要点:磁盘 IO、范围查询、叶子节点链表、树高低、稳定查询效率。

## Redis
- 题目:缓存穿透、击穿、雪崩分别是什么?怎么解决?
  答案要点:布隆过滤器、空值缓存、互斥锁、逻辑过期、随机 TTL、多级缓存。
EOF

命令解释

cat > /root/.hermes/interview/questions.md <<'EOF'
...
EOF

这是 shell heredoc 写法。

含义是:把 EOF 中间的内容写入文件:

/root/.hermes/interview/questions.md

如果文件不存在,会创建;如果文件已存在,会覆盖。


5. 查看面试题文件

在服务器上查看:

cat /root/.hermes/interview/questions.md

命令解释

cat

输出文件内容。


也可以从容器视角查看:

docker exec -it hermes sh -lc 'cat /opt/data/interview/questions.md'

命令解释

docker exec -it hermes

在正在运行的 hermes 容器中执行命令。

sh -lc 'cat /opt/data/interview/questions.md'

在容器内启动 shell,并执行 cat /opt/data/interview/questions.md

如果能看到文件内容,说明宿主机路径和容器路径映射正常。


6. Hermes 能不能读取 txt 文件?

可以。

Hermes 可以读取:

/opt/data/interview/*.txt
/opt/data/interview/*.md

但实际读取时可能遇到两个问题:

  1. 文件编码不是 UTF-8,例如 GBK、GB2312
  2. Hermes 为了读取文件,可能调用 python3 -c ...,触发安全审批

例如曾经出现过类似命令:

python3 -c "..."
open('/opt/data/interview/xxx.txt', 'rb')

Hermes 认为这种命令需要人工审批,于是暂停任务。


7. /approve/deny/stop 的作用

当 Hermes 在微信里提示某个命令需要批准时,可以回复:

/approve

表示批准这一次操作继续执行。

也可以回复:

/deny

表示拒绝这次操作。

如果当前任务卡住,不想继续,可以回复:

/stop

表示停止当前 Agent 任务。

什么时候可以 /approve

如果命令只是读取自己的面试题目录,例如:

cat /opt/data/interview/xxx.txt
python3 -c "open('/opt/data/interview/xxx.txt', 'rb')..."
ls /opt/data/interview

通常可以批准。

什么时候不要随便 /approve

如果命令包含:

rm -rf
curl ... | sh
wget ... | bash
cat /opt/data/.env
cat ~/.ssh/id_rsa
docker ...
apt install
chmod 777
scp
ssh

就要谨慎。

尤其是读取 .env、API Key、私钥、删除文件、联网下载脚本这类,不要随便批准。


8. 第一次自然语言创建任务时的问题

曾经直接在微信里用自然语言要求:

/opt/data/interview 目录下存放的是我已看过的面试题文件,
请每隔一小时抽一道题发送给我复习...

Hermes 可能把这个需求理解为:

我要先创建一个脚本 /opt/data/scripts/check_and_send.sh,
然后创建一个 cron 任务定时执行这个脚本。

结果出现错误:

Script not found: /opt/data/scripts/check_and_send.sh

原因

容器内:

/opt/data/scripts/check_and_send.sh

对应宿主机:

/root/.hermes/scripts/check_and_send.sh

但这个脚本实际没有被创建成功。

所以 cron 任务指向了一个不存在的脚本,执行时就报错。


9. 自然语言创建任务为什么容易出问题

自然语言说:

帮我创建一个任务,每小时抽一道题

Hermes 可能会自由设计实现方式,比如:

  1. 直接创建 cron
  2. 先创建脚本,再创建 cron
  3. 读取文件后生成中间文件
  4. 创建一个 skill
  5. 使用工具读取目录

如果中途安全审批被打断,或者脚本没有真正写入磁盘,就可能出现:

任务创建了
但任务依赖的脚本不存在

所以,后续建议使用明确的 CLI 命令创建 cron。


10. 推荐的任务创建方式

推荐在 SSH 里创建 cron,而不是在微信里自然语言创建。

基本格式:

docker run -it --rm \
  -v /root/.hermes:/opt/data \
  -e TZ=Asia/Shanghai \
  nousresearch/hermes-agent cron create \
  --name "任务名称" \
  --deliver "weixin:微信chat_id" \
  "cron表达式" \
  "任务提示词"

11. 为什么不用 docker exec hermes hermes cron ...

之前已经遇到过:

docker exec -it hermes hermes pairing list

报错:

exec: "hermes": executable file not found in $PATH

同理,cron 管理也不推荐这样写:

docker exec -it hermes hermes cron list

而是使用:

docker run -it --rm \
  -v /root/.hermes:/opt/data \
  -e TZ=Asia/Shanghai \
  nousresearch/hermes-agent cron list

原因是 docker run nousresearch/hermes-agent ... 会走镜像 entrypoint,能正确执行 Hermes CLI。


12. 查看 cron 帮助

执行:

docker run -it --rm \
  -v /root/.hermes:/opt/data \
  -e TZ=Asia/Shanghai \
  nousresearch/hermes-agent cron --help

输出显示 cron 支持:

list
create
add
edit
pause
resume
run
remove
rm
delete
status
tick

子命令说明

命令 作用
list 查看任务列表
create / add 创建任务
edit 编辑任务
pause 暂停任务
resume 恢复任务
run 标记任务在下一个 scheduler tick 执行
remove / rm / delete 删除任务
status 查看 cron scheduler 状态
tick 执行一次到期任务并退出

13. 查看 cron create 帮助

执行:

docker run -it --rm \
  -v /root/.hermes:/opt/data \
  -e TZ=Asia/Shanghai \
  nousresearch/hermes-agent cron create --help

看到类似:

usage: hermes cron create [-h] [--name NAME] [--deliver DELIVER] [--repeat REPEAT] [--skill SKILLS] [--script SCRIPT] [--no-agent] [--workdir WORKDIR] schedule [prompt]

重要参数:

参数 作用
--name NAME 设置任务名称
--deliver DELIVER 设置投递目标
--repeat REPEAT 设置重复次数
--skill SKILLS 附加 skill
--script SCRIPT 执行脚本
--no-agent 跳过 LLM,只执行脚本
--workdir WORKDIR 指定工作目录
schedule 定时表达式
prompt 任务提示词

14. --deliver 的作用

--deliver 决定任务结果发到哪里。

帮助信息中说明:

Delivery target: origin, local, telegram, discord, signal, or platform:chat_id

常见值:

deliver 值 含义
local 本地执行/本地输出,不发微信
origin 原始来源
weixin:chat_id 投递到指定微信会话
telegram 投递到 Telegram
discord 投递到 Discord

当前要发微信,所以必须用:

weixin:你的微信chat_id

15. 为什么第一次 cron 创建成功但微信没收到

第一次创建任务时执行了类似:

docker run -it --rm \
  -v /root/.hermes:/opt/data \
  -e TZ=Asia/Shanghai \
  nousresearch/hermes-agent cron add "0 * * * *" "请阅读..."

创建成功后 cron list 显示:

Deliver: local

这表示任务投递目标是本地,不是微信。

所以即使任务创建成功,也不会主动发到微信。

解决方法

删除旧任务,重新创建时加上:

--deliver "weixin:微信chat_id"

16. 获取微信 chat_id

微信 /sethome 成功后,日志或回复中曾出现类似:

o9cq80y9HMRyFHDRQ5NMyWk8cYcc@im.wechat

这就是当前微信私聊会话的 chat_id。

用于 cron 投递时,需要写成:

weixin:o9cq80y9HMRyFHDRQ5NMyWk8cYcc@im.wechat

17. 删除旧的 local 任务

假设旧任务 ID 是:

f9d567d4707d

删除命令:

docker run -it --rm \
  -v /root/.hermes:/opt/data \
  -e TZ=Asia/Shanghai \
  nousresearch/hermes-agent cron remove f9d567d4707d

命令解释

cron remove f9d567d4707d

删除指定 ID 的 cron 任务。

remove 也可以写成:

rm
delete

具体可通过 cron --help 查看。


18. 创建投递到微信的面试题任务

执行:

docker run -it --rm \
  -v /root/.hermes:/opt/data \
  -e TZ=Asia/Shanghai \
  nousresearch/hermes-agent cron create \
  --name "面试题复习" \
  --deliver "weixin:o9cq80y9HMRyFHDRQ5NMyWk8cYcc@im.wechat" \
  "0 * * * *" \
  "请阅读 /opt/data/interview/ 目录下的 txt、md 文件,从里面随机抽取一道我已看过的面试题发给我复习。要求:只发题目,不要直接发答案;如果无法读取文件,请明确告诉我原因。"

命令逐段解释

docker run -it --rm

启动一个临时容器,执行完删除容器。

-v /root/.hermes:/opt/data

挂载 Hermes 数据目录,保证 CLI 操作的是和 gateway 同一份数据。

-e TZ=Asia/Shanghai

使用北京时间。

nousresearch/hermes-agent cron create

调用 Hermes cron 创建命令。

--name "面试题复习"

设置任务名称,方便以后在列表里识别。

--deliver "weixin:o9cq80y9HMRyFHDRQ5NMyWk8cYcc@im.wechat"

把任务结果投递到指定微信私聊会话。

"0 * * * *"

cron 表达式,表示每小时第 0 分钟执行。

也就是:

每小时整点执行
"请阅读 /opt/data/interview/ ..."

任务提示词。

它必须是自包含的,也就是说任务里要写清楚:

  • 读哪个目录
  • 读什么文件类型
  • 抽取什么内容
  • 是否发答案
  • 失败时怎么处理

19. cron 表达式说明

当前使用:

0 * * * *

五段含义:

分 时 日 月 周

所以:

0 * * * *

表示:

每小时的第 0 分钟执行

常见示例:

表达式 含义
0 * * * * 每小时整点
*/30 * * * * 每 30 分钟
0 9 * * * 每天 9:00
0 21 * * * 每天 21:00
0 9 * * 1-5 工作日每天 9:00
0 9,21 * * * 每天 9:00 和 21:00

20. 查看任务列表

执行:

docker run -it --rm \
  -v /root/.hermes:/opt/data \
  -e TZ=Asia/Shanghai \
  nousresearch/hermes-agent cron list

正常看到:

97c0d4aef80d [active]
  Name:      面试题复习
  Schedule:  0 * * * *
  Repeat:    ∞
  Next run:  2026-05-08T17:00:00+08:00
  Deliver:   weixin:o9cq80y9HMRyFHDRQ5NMyWk8cYcc@im.wechat

重点看:

Deliver: weixin:...

如果显示:

Deliver: local

说明不会发微信,需要删除重建。


21. 手动触发任务

执行:

docker run -it --rm \
  -v /root/.hermes:/opt/data \
  -e TZ=Asia/Shanghai \
  nousresearch/hermes-agent cron run 97c0d4aef80d

命令解释

cron run 97c0d4aef80d

标记这个任务在下一个 scheduler tick 执行。

注意:它不是立即在当前命令中完成执行。

输出可能是:

Triggered job: 面试题复习 (97c0d4aef80d)
Next run: 2026-05-08T16:10:13.316515+08:00
It will run on the next scheduler tick.

意思是:

任务已被标记为马上运行
等待正在运行的 gateway scheduler 下一次 tick 时执行

所以要等一会儿,并观察 gateway 日志。


22. 查看 gateway 日志

执行:

docker compose -f /root/compose.hermes.yml logs -f hermes

或者查看最近 200 行:

docker compose -f /root/compose.hermes.yml logs --tail=200 hermes

如果只想看 cron、微信、错误相关日志:

docker compose -f /root/compose.hermes.yml logs --tail=300 hermes | grep -Ei "cron|weixin|deliver|auth|unauthorized|error|scheduler|job"

23. Gateway is not running — jobs won't fire automatically 的含义

在执行 CLI 的 cron list 时,曾看到:

⚠ Gateway is not running — jobs won't fire automatically.
Start it with: hermes gateway install

这条提示容易误导。

当前我们不是在宿主机原生安装 Hermes,而是通过 Docker Compose 运行 gateway。

CLI 临时容器本身无法准确判断另一个 compose 容器里的 gateway 状态,所以它可能提示:

Gateway is not running

但实际上 compose 容器正在运行。

如何确认 gateway 是否真的在运行

执行:

docker ps

看到:

hermes   Up ...

说明容器在运行。

再执行:

docker compose -f /root/compose.hermes.yml logs --tail=100 hermes

看到 gateway 启动日志,说明 gateway 在运行。

如果微信能回复普通消息,也说明 gateway 是正常的。


24. cron 创建成功且 deliver 是 weixin,但微信还是没收到

后来出现:

Deliver: weixin:o9cq80y9HMRyFHDRQ5NMyWk8cYcc@im.wechat

但微信仍然没收到。

此时日志中出现:

WARNING gateway.run: No user allowlists configured. All unauthorized users will be denied.
WARNING gateway.run: Unauthorized user: o9cq80y9HMRyFHDRQ5NMyWk8cYcc@im.wechat

这说明问题不是 cron 创建失败,也不是 deliver 配错,而是:

微信用户仍然被 gateway 判定为 unauthorized

也就是用户授权 / allowlist 仍有问题。


25. Unauthorized user 的含义

日志:

Unauthorized user: o9cq80y9HMRyFHDRQ5NMyWk8cYcc@im.wechat

含义:

Gateway 收到了来自该微信用户的消息,
但当前授权配置不允许该用户调用 Hermes。

这会影响:

  • 普通微信消息
  • slash command
  • cron 投递
  • 主动推送

如果投递目标的微信用户未被授权,cron 即使执行了,也可能发不出去。


26. 配置微信用户 allowlist

如果 pairing 机制没有完全解决授权问题,可以手动把微信 chat_id 加入 allowlist。

编辑 .env

nano /root/.hermes/.env

追加:

WEIXIN_ALLOWED_USERS=o9cq80y9HMRyFHDRQ5NMyWk8cYcc@im.wechat

同时建议确认:

WEIXIN_DM_POLICY=pairing
WEIXIN_GROUP_POLICY=disabled
TZ=Asia/Shanghai

保存后重启 gateway:

docker compose -f /root/compose.hermes.yml restart hermes

然后测试微信:

/status

如果 /status 正常,再测试:

你好

再手动触发 cron:

docker run -it --rm \
  -v /root/.hermes:/opt/data \
  -e TZ=Asia/Shanghai \
  nousresearch/hermes-agent cron run 97c0d4aef80d

27. 注意 allowlist 变量名可能因版本不同而不同

日志提示中说:

Set GATEWAY_ALLOW_ALL_USERS=true in ~/.hermes/.env to allow open access,
or configure platform allowlists

这说明 Hermes 至少支持一个全局开关:

GATEWAY_ALLOW_ALL_USERS=true

临时排查时可以使用

为了确认问题确实是授权导致,可以临时加:

GATEWAY_ALLOW_ALL_USERS=true

然后重启:

docker compose -f /root/compose.hermes.yml restart hermes

如果加了之后 cron 能发微信,说明问题确实是 allowlist / 用户授权。

安全提醒

长期不建议保持:

GATEWAY_ALLOW_ALL_USERS=true

因为这可能允许其他未授权用户调用你的 Hermes,消耗你的 API Key。

更安全的是只允许自己的微信 ID。


28. 微信里 /cron 显示 Unknown command 的问题

曾经在微信里发送:

/cron remove 4f5287b56786

结果微信回复:

Unknown command: /cron

日志也显示:

Unrecognized slash command /cron from weixin

说明当前 Weixin Gateway 没有把 /cron 识别为管理命令。

可能原因:

  1. Weixin 平台不支持全部 slash command
  2. 当前用户未授权,命令被拒绝后进入 unknown
  3. Gateway 命令注册状态不完整
  4. Hermes 版本差异
  5. 当前 Agent 正在执行任务,命令没有进入管理分支

解决策略

管理 cron 不依赖微信命令,而是用 SSH 执行:

docker run -it --rm \
  -v /root/.hermes:/opt/data \
  -e TZ=Asia/Shanghai \
  nousresearch/hermes-agent cron list

也就是说:

微信用于聊天和接收提醒
SSH 用于管理 cron 任务

这是目前最稳的方式。


29. 当前推荐的稳定架构

推荐使用以下分工:

Docker Compose:
  负责常驻运行 Hermes Gateway

SSH CLI:
  负责创建、查看、删除、触发 cron

微信:
  负责聊天、接收定时推送、回答面试题

/root/.hermes/interview:
  存放面试题文件

/opt/data/interview:
  Hermes 容器内读取面试题的路径

30. 最终推荐命令模板:每小时抽一道面试题发微信

先确认微信 chat_id:

o9cq80y9HMRyFHDRQ5NMyWk8cYcc@im.wechat

创建任务:

docker run -it --rm \
  -v /root/.hermes:/opt/data \
  -e TZ=Asia/Shanghai \
  nousresearch/hermes-agent cron create \
  --name "面试题复习" \
  --deliver "weixin:o9cq80y9HMRyFHDRQ5NMyWk8cYcc@im.wechat" \
  "0 * * * *" \
  "请阅读 /opt/data/interview/ 目录下的 txt、md 文件,从里面随机抽取一道我已看过的面试题发给我复习。要求:只发题目,不要直接发答案;如果文件太长,优先抽取包含「题目」「问题」「面试题」「问:」「Q:」「Q:」等关键词附近的内容;如果无法读取文件,请明确告诉我原因。"

31. 最终推荐命令模板:每天早上 9 点抽 3 道题

docker run -it --rm \
  -v /root/.hermes:/opt/data \
  -e TZ=Asia/Shanghai \
  nousresearch/hermes-agent cron create \
  --name "每日面试题早练" \
  --deliver "weixin:o9cq80y9HMRyFHDRQ5NMyWk8cYcc@im.wechat" \
  "0 9 * * *" \
  "请阅读 /opt/data/interview/ 目录下的 txt、md 文件,从里面随机抽取 3 道我已看过的面试题发给我复习。要求:只发题目,不要直接发答案;题目按 1、2、3 编号;最后提醒我回复「批改面试题:我的答案是...」后你再根据题库内容进行批改。"

32. 最终推荐命令模板:晚上 9 点复盘提醒

docker run -it --rm \
  -v /root/.hermes:/opt/data \
  -e TZ=Asia/Shanghai \
  nousresearch/hermes-agent cron create \
  --name "面试题晚间复盘" \
  --deliver "weixin:o9cq80y9HMRyFHDRQ5NMyWk8cYcc@im.wechat" \
  "0 21 * * *" \
  "提醒我复盘今天的面试题。请让我先回忆今天做过的题,不要直接给答案。提醒我可以回复「复盘:...」来让你帮我检查遗漏点。"

33. 查看所有任务

docker run -it --rm \
  -v /root/.hermes:/opt/data \
  -e TZ=Asia/Shanghai \
  nousresearch/hermes-agent cron list

重点检查:

[active]
Schedule
Next run
Deliver

34. 删除任务

假设任务 ID 是:

97c0d4aef80d

删除:

docker run -it --rm \
  -v /root/.hermes:/opt/data \
  -e TZ=Asia/Shanghai \
  nousresearch/hermes-agent cron remove 97c0d4aef80d

35. 暂停任务

docker run -it --rm \
  -v /root/.hermes:/opt/data \
  -e TZ=Asia/Shanghai \
  nousresearch/hermes-agent cron pause 97c0d4aef80d

36. 恢复任务

docker run -it --rm \
  -v /root/.hermes:/opt/data \
  -e TZ=Asia/Shanghai \
  nousresearch/hermes-agent cron resume 97c0d4aef80d

37. 手动触发任务

docker run -it --rm \
  -v /root/.hermes:/opt/data \
  -e TZ=Asia/Shanghai \
  nousresearch/hermes-agent cron run 97c0d4aef80d

然后等待 gateway scheduler tick,并查看日志:

docker compose -f /root/compose.hermes.yml logs -f hermes

38. 如果任务卡住怎么办

如果微信里提示当前 Agent 正在执行,导致不能执行其他命令:

Agent is running

可以在微信回复:

/stop

或者重启 gateway:

docker compose -f /root/compose.hermes.yml restart hermes

注意:重启会中断当前任务,微信可能收到:

Gateway shutting down — Your current task will be interrupted.

这是正常提示。


39. 如果出现安全审批

如果微信提示要批准某个命令:

Command requires approval

可以根据命令内容判断。

读取面试题文件通常可以:

/approve

拒绝:

/deny

停止当前任务:

/stop

40. 如果出现 Script not found

错误:

Script not found: /opt/data/scripts/check_and_send.sh

说明任务依赖脚本,但脚本不存在。

解决方式一:删除该任务,重新创建不依赖脚本的任务。

docker run -it --rm \
  -v /root/.hermes:/opt/data \
  -e TZ=Asia/Shanghai \
  nousresearch/hermes-agent cron remove 任务ID

然后用 cron create 重新创建纯 prompt 任务。

解决方式二:真的创建脚本。

宿主机路径:

/root/.hermes/scripts/check_and_send.sh

容器内路径:

/opt/data/scripts/check_and_send.sh

但当前阶段更推荐方式一,少依赖脚本,更简单。


41. 如果 txt 文件编码导致读取失败

中文 txt 可能是:

UTF-8
GBK
GB2312

如果 Hermes 读取失败,可以先在宿主机检查编码:

file /root/.hermes/interview/你的文件.txt

如果需要转成 UTF-8:

iconv -f gbk -t utf-8 /root/.hermes/interview/原文件.txt > /root/.hermes/interview/转换后文件.txt

命令解释

file

识别文件类型和可能的编码。

iconv

转换文本编码。

-f gbk

原编码是 GBK。

-t utf-8

目标编码是 UTF-8。


42. 推荐整理面试题文件格式

为了让 Hermes 更容易抽题,建议使用清晰格式:

# Java 面试题

## HashMap

题目:HashMap 1.7 和 1.8 的区别是什么?

答案要点:
- 1.7 使用数组 + 链表
- 1.8 链表过长会转红黑树
- 1.7 扩容头插法可能导致环
- 1.8 使用尾插法
- 线程不安全

或者:

Q:B+ 树为什么适合数据库索引?

A:
- 非叶子节点只存索引,树高更低
- 叶子节点链表适合范围查询
- 磁盘 IO 次数少

任务提示词里可以让 Hermes 优先识别:

题目
问题
面试题
问:
Q:
Q:

43. 当前推荐的排查顺序

如果微信没有收到 cron 面试题,按这个顺序排查:

第一步:确认任务存在

docker run -it --rm \
  -v /root/.hermes:/opt/data \
  -e TZ=Asia/Shanghai \
  nousresearch/hermes-agent cron list

看是否有任务。


第二步:确认 deliver 不是 local

应该是:

Deliver: weixin:xxx@im.wechat

不能是:

Deliver: local

第三步:确认 gateway 容器运行

docker ps

应该看到:

hermes   Up ...

第四步:确认微信普通聊天可用

微信发:

/status

再发:

你好

如果普通聊天不可用,先修微信授权,不要继续修 cron。


第五步:查看日志是否 unauthorized

docker compose -f /root/compose.hermes.yml logs --tail=300 hermes | grep -Ei "unauthorized|weixin|cron|deliver|error"

如果看到:

Unauthorized user

说明要修 allowlist / pairing。


第六步:手动触发任务

docker run -it --rm \
  -v /root/.hermes:/opt/data \
  -e TZ=Asia/Shanghai \
  nousresearch/hermes-agent cron run 任务ID

等待 1 分钟,看日志。


44. 当前阶段最终状态目标

最终应该达到:

任务列表中有 active 任务

面试题复习 [active]

投递目标是微信

Deliver: weixin:o9cq80y9HMRyFHDRQ5NMyWk8cYcc@im.wechat

Gateway 正在运行

docker ps

看到:

hermes   Up ...

微信普通聊天正常

/status
你好

都能回复。

手动触发 cron 后微信收到题目

docker run -it --rm \
  -v /root/.hermes:/opt/data \
  -e TZ=Asia/Shanghai \
  nousresearch/hermes-agent cron run 任务ID

等待 scheduler tick 后,微信收到面试题。


45. 第 3 部分常用命令汇总

创建面试题目录

mkdir -p /root/.hermes/interview

查看面试题目录

ls -la /root/.hermes/interview

容器内查看面试题目录

docker exec -it hermes sh -lc 'ls -la /opt/data/interview'

查看 cron 帮助

docker run -it --rm \
  -v /root/.hermes:/opt/data \
  -e TZ=Asia/Shanghai \
  nousresearch/hermes-agent cron --help

查看 cron create 帮助

docker run -it --rm \
  -v /root/.hermes:/opt/data \
  -e TZ=Asia/Shanghai \
  nousresearch/hermes-agent cron create --help

查看任务

docker run -it --rm \
  -v /root/.hermes:/opt/data \
  -e TZ=Asia/Shanghai \
  nousresearch/hermes-agent cron list

创建微信投递任务

docker run -it --rm \
  -v /root/.hermes:/opt/data \
  -e TZ=Asia/Shanghai \
  nousresearch/hermes-agent cron create \
  --name "面试题复习" \
  --deliver "weixin:o9cq80y9HMRyFHDRQ5NMyWk8cYcc@im.wechat" \
  "0 * * * *" \
  "请阅读 /opt/data/interview/ 目录下的 txt、md 文件,从里面随机抽取一道我已看过的面试题发给我复习。要求:只发题目,不要直接发答案;如果无法读取文件,请明确告诉我原因。"

删除任务

docker run -it --rm \
  -v /root/.hermes:/opt/data \
  -e TZ=Asia/Shanghai \
  nousresearch/hermes-agent cron remove 任务ID

手动触发任务

docker run -it --rm \
  -v /root/.hermes:/opt/data \
  -e TZ=Asia/Shanghai \
  nousresearch/hermes-agent cron run 任务ID

看日志

docker compose -f /root/compose.hermes.yml logs -f hermes

重启 gateway

docker compose -f /root/compose.hermes.yml restart hermes

编辑 .env

nano /root/.hermes/.env

46. 本阶段易踩坑汇总

坑 1:认为任务创建成功就一定会发微信

实际要看:

Deliver

如果是:

local

就不会发微信。

必须是:

weixin:xxx@im.wechat

坑 2:自然语言创建任务生成了不存在的脚本

表现:

Script not found: /opt/data/scripts/check_and_send.sh

原因:

cron 任务依赖脚本,但脚本没创建成功

解决:

删除任务,重新创建不依赖脚本的 prompt 型 cron。


坑 3:微信里 /cron 是 Unknown command

表现:

Unknown command: /cron

解决:

不用微信管理 cron,用 SSH 管理:

docker run -it --rm ... nousresearch/hermes-agent cron list

坑 4:cron run 后微信没有马上收到

原因:

cron run 只是标记任务在下一个 scheduler tick 执行

要等待 gateway 调度器处理。

同时查看日志:

docker compose -f /root/compose.hermes.yml logs -f hermes

坑 5:Gateway is not running 提示不一定准确

CLI 临时容器可能看不到 compose 容器里的 gateway。

以这两个为准:

docker ps

和微信普通聊天是否可用。


坑 6:cron deliver 正确但仍然没收到微信

如果日志有:

Unauthorized user

说明是授权问题。

解决:

  1. pairing approve
  2. 配置 allowlist
  3. 必要时临时 GATEWAY_ALLOW_ALL_USERS=true 排查
  4. 重启 gateway

47. 推荐的长期使用方式

文件管理

所有面试题都放在:

/root/.hermes/interview

支持:

.md
.txt

尽量使用 UTF-8 编码。


服务管理

Hermes Gateway 用 compose 常驻:

docker compose -f /root/compose.hermes.yml up -d

任务管理

cron 用 SSH 管理:

docker run -it --rm \
  -v /root/.hermes:/opt/data \
  -e TZ=Asia/Shanghai \
  nousresearch/hermes-agent cron list

微信使用

微信用于:

聊天
接收面试题
回答题目
请求批改

例如:

批改面试题:我的答案是...

48. 当前项目总体结构

宿主机:

/root
├── compose.hermes.yml
└── .hermes
    ├── .env
    ├── interview
    │   ├── questions.md
    │   └── 其他面试题.txt
    ├── scripts
    ├── skills
    ├── sessions
    └── cron / config / memories 等 Hermes 数据

容器内:

/opt/data
├── .env
├── interview
│   ├── questions.md
│   └── 其他面试题.txt
├── scripts
├── skills
├── sessions
└── cron / config / memories 等 Hermes 数据

两者对应关系:

/root/.hermes  <=>  /opt/data

49. 下一步建议

当前下一步应该重点解决:

cron deliver 已经是 weixin,但微信仍然没收到

根据日志,优先处理:

Unauthorized user

建议操作:

  1. 确认 /status 普通微信命令是否可用
  2. 如果不可用,重新 pairing approve
  3. 如果 pairing 后仍 unauthorized,配置 allowlist
  4. 重启 gateway
  5. 再手动 cron run
  6. 看日志是否还有 unauthorized

50. 最小可用闭环

最终最小闭环应该是:

# 1. 确认 gateway 正在运行
docker ps

# 2. 确认微信普通聊天正常
# 微信发送:/status

# 3. 确认 cron 任务 deliver 到微信
docker run -it --rm \
  -v /root/.hermes:/opt/data \
  -e TZ=Asia/Shanghai \
  nousresearch/hermes-agent cron list

# 4. 手动触发 cron
docker run -it --rm \
  -v /root/.hermes:/opt/data \
  -e TZ=Asia/Shanghai \
  nousresearch/hermes-agent cron run 任务ID

# 5. 查看日志
docker compose -f /root/compose.hermes.yml logs -f hermes

当这 5 步都正常后,就可以长期使用 Hermes Agent 通过微信定时复习面试题。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐