服务器部署Hermes【超详细版本】(三):知识库、定时任务与故障排查
注:服务器部署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
但实际读取时可能遇到两个问题:
- 文件编码不是 UTF-8,例如 GBK、GB2312
- 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 可能会自由设计实现方式,比如:
- 直接创建 cron
- 先创建脚本,再创建 cron
- 读取文件后生成中间文件
- 创建一个 skill
- 使用工具读取目录
如果中途安全审批被打断,或者脚本没有真正写入磁盘,就可能出现:
任务创建了
但任务依赖的脚本不存在
所以,后续建议使用明确的 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 识别为管理命令。
可能原因:
- Weixin 平台不支持全部 slash command
- 当前用户未授权,命令被拒绝后进入 unknown
- Gateway 命令注册状态不完整
- Hermes 版本差异
- 当前 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
说明是授权问题。
解决:
- pairing approve
- 配置 allowlist
- 必要时临时
GATEWAY_ALLOW_ALL_USERS=true排查 - 重启 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
建议操作:
- 确认
/status普通微信命令是否可用 - 如果不可用,重新 pairing approve
- 如果 pairing 后仍 unauthorized,配置 allowlist
- 重启 gateway
- 再手动
cron run - 看日志是否还有 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 通过微信定时复习面试题。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)