纯脚本定时任务
有时候你已经明确知道想发送什么消息。你不需要 Agent 来推理——只需要一个脚本按计时器运行,如果有输出就投递到 Telegram / Discord / Slack / Signal。
Hermes 将此称为无 Agent 模式。这是去掉 LLM 的定时任务系统。
┌──────────────────┐ ┌──────────────────┐
│ scheduler tick │ every │ run script │
│ (every N minutes)│ ──────▶ │ (bash or python) │
└──────────────────┘ └──────────────────┘
│
│ stdout
▼
┌──────────────────┐
│ delivery router │
│ (telegram/disc…) │
└──────────────────┘
- 不调用 LLM。 零 token,零 Agent 循环,零模型费用。
- 脚本即任务。 脚本决定是否告警。有输出 → 发送消息;没有输出 → 静默执行。
- Bash 或 Python。
.sh/.bash文件在/bin/bash下运行;其他扩展名在当前 Python 解释器下运行。~/.hermes/scripts/中的任何文件均可使用。 - 同一调度器。 与 LLM 任务共存于
cronjob中——暂停、恢复、列举、日志和投递目标的操作方式完全相同。
适用场景
在以下情况使用无 Agent 模式:
- 内存 / 磁盘 / GPU 看门狗。 每 5 分钟运行一次,仅当超过阈值时告警。
- CI 钩子。 部署完成 → 发送 commit SHA;构建失败 → 发送最后 100 行日志。
- 周期性指标。 "每天上午 9 点的 Stripe 日收入"——一个简单的 API 调用加格式化输出。
- 外部事件轮询。 调用 API,在状态变更时告警。
- 心跳检测。 每 N 分钟 ping 一次仪表板,证明主机存活。
当你需要 Agent 决定说什么时——总结长文档、从 feed 中挑选有趣条目、起草友好的提醒——请使用普通的(LLM 驱动的)定时任务。无 Agent 路径适用于脚本的标准输出本身就是消息内容的场景。
通过聊天创建
无 Agent 模式的真正优势在于:Agent 本身可以为你设置看门狗——无需编辑器,无需 shell,无需记忆 CLI 标志。你描述想要什么,Hermes 写好脚本、安排好调度,并告诉你何时触发。
示例对话
你: 每 5 分钟检查一次,如果 RAM 超过 85% 就在 Telegram 告警我
Hermes: (写入
~/.hermes/scripts/memory-watchdog.sh,然后调用带no_agent=true的cronjob(...))已设置。每 5 分钟运行,RAM 超过 85% 时告警 Telegram。脚本:
memory-watchdog.sh。任务 ID:abc123。
底层,Agent 发起两次工具调用:
# 1. 写入检查脚本
write_file(
path="~/.hermes/scripts/memory-watchdog.sh",
content='''#!/usr/bin/env bash
ram_pct=$(free | awk '/^Mem:/ {printf "%d", $3 * 100 / $2}')
if [ "$ram_pct" -ge 85 ]; then
echo "RAM ${ram_pct}% on $(hostname)"
fi
# 空的 stdout = 静默执行;不发送消息。
''',
)
# 2. 调度任务 — no_agent=True 使每次触发时跳过 LLM
cronjob(
action="create",
schedule="every 5m",
script="memory-watchdog.sh",
no_agent=True,
deliver="telegram",
name="memory-watchdog",
)
从此每次触发都是免费的:调度器运行脚本,如果标准输出非空就传递给 Telegram,从不接触模型。
Agent 为你决定的事
当你的请求类似"X 时告警我"或"每 N 分钟检查 Y,如果 Z 就告诉我",Hermes 的 cronjob 工具描述会告诉它:只要消息内容完全由脚本决定,就使用 no_agent=True。当请求需要推理时("总结新 issue"、"挑选最有趣的头条"、"起草友好的提醒"),则回退到普通的 LLM 驱动路径。
你不需要自己指定 --no-agent。只需描述你想要的行为即可。
通过聊天管理看门狗
Agent 可以像创建任务一样暂停、恢复、编辑和删除任务:
你: 今晚先停掉内存看门狗
Hermes: (调用
cronjob(action='pause', job_id='abc123'))已暂停。说"重新开启"或通过
hermes cron resume abc123来恢复。
你: 把它改成每 15 分钟检查一次
Hermes: (调用
cronjob(action='update', job_id='abc123', schedule='every 15m'))
完整的生命周期(创建 / 列举 / 更新 / 暂停 / 恢复 / 立即执行 / 删除)都可以通过 Agent 操作,无需学习任何 CLI 命令。
通过 CLI 创建
偏好 shell?CLI 路径用三条命令实现同样的效果:
# 1. 写入脚本
cat > ~/.hermes/scripts/memory-watchdog.sh <<'EOF'
#!/usr/bin/env bash
# RAM 使用超过 85% 时告警,否则静默。
RAM_PCT=$(free | awk '/^Mem:/ {printf "%d", $3 * 100 / $2}')
if [ "$RAM_PCT" -ge 85 ]; then
echo "⚠ RAM ${RAM_PCT}% on $(hostname)"
fi
# 空的 stdout = 静默运行;不发送消息。
EOF
chmod +x ~/.hermes/scripts/memory-watchdog.sh
# 2. 调度任务
hermes cron create "every 5m" \
--no-agent \
--script memory-watchdog.sh \
--deliver telegram \
--name "memory-watchdog"
# 3. 验证
hermes cron list
hermes cron run <job_id> # 触发一次测试
就是这些。无提示词,无技能,无模型。
脚本输出如何映射到投递
| 脚本行为 | 结果 |
|---|---|
| 退出码 0,非空 stdout | stdout 原样投递 |
| 退出码 0,空 stdout | 静默执行——不投递 |
退出码 0,stdout 最后一行包含 {"wakeAgent": false} | 静默执行(与 LLM 任务共用的静默门) |
| 非零退出码 | 投递错误告警(确保损坏的看门狗不会静默失败) |
| 脚本超时 | 投递错误告警 |
"空输出时静默"的行为是经典看门狗模式的关键:脚本可以每分钟运行,但频道只在真正有需要关注的事情时才会收到消息。
脚本规则
脚本必须存放在 ~/.hermes/scripts/。这在任务创建和运行时均会强制检查——绝对路径、~/ 展开和路径遍历模式(../)都会被拒绝。同一目录与 LLM 任务使用的预检查脚本门共用。
解释器选择由文件扩展名决定:
| 扩展名 | 解释器 |
|---|---|
.sh、.bash | /bin/bash |
| 其他扩展名 | sys.executable(当前 Python) |
我们有意不遵守 #!/... shebang——保持解释器集合明确且精简,可以减少调度器信任的攻击面。
调度语法
与所有其他定时任务相同:
hermes cron create "every 5m" # 间隔
hermes cron create "every 2h"
hermes cron create "0 9 * * *" # 标准 cron:每天上午 9 点
hermes cron create "30m" # 一次性:30 分钟后运行一次
完整语法请参阅定时任务功能参考。
投递目标
--deliver 接受网关支持的所有目标。常见格式:
--deliver telegram # 平台主频道
--deliver telegram:-1001234567890 # 指定聊天
--deliver telegram:-1001234567890:17585 # 指定 Telegram 论坛话题
--deliver discord:#ops
--deliver slack:#engineering
--deliver signal:+15551234567
--deliver local # 仅保存到 ~/.hermes/cron/output/
对于使用机器人令牌的平台(Telegram、Discord、Slack、Signal、SMS、WhatsApp),脚本运行时不需要网关在线——工具直接使用 ~/.hermes/.env / ~/.hermes/config.yaml 中已有的凭证调用各平台的 REST 端点。
编辑与生命周期
hermes cron list # 查看所有任务
hermes cron pause <job_id> # 停止触发,保留定义
hermes cron resume <job_id>
hermes cron edit <job_id> --schedule "every 10m" # 调整频率
hermes cron edit <job_id> --agent # 切换到 LLM 模式
hermes cron edit <job_id> --no-agent --script … # 切换回无 Agent 模式
hermes cron remove <job_id> # 删除任务
所有适用于 LLM 任务的操作(暂停、恢复、手动触发、投递目标修改)同样适用于无 Agent 任务。
示例:磁盘空间告警
cat > ~/.hermes/scripts/disk-alert.sh <<'EOF'
#!/usr/bin/env bash
# 当 / 或 /home 使用率超过 90% 时告警。
THRESHOLD=90
df -h / /home 2>/dev/null | awk -v t="$THRESHOLD" '
NR > 1 && $5+0 >= t {
printf "⚠ Disk %s full on %s\n", $5, $6
}
'
EOF
chmod +x ~/.hermes/scripts/disk-alert.sh
hermes cron create "*/15 * * * *" \
--no-agent \
--script disk-alert.sh \
--deliver telegram \
--name "disk-alert"
当两个文件系统都低于 90% 时静默;当其中一个填满时,每个超阈值的文件系统各触发一行告警。
与其他模式的对比
| 方式 | 运行的内容 | 适用场景 |
|---|---|---|
hermes send(一次性) | 任何通过管道传入的 shell 命令 | 临时投递,或作为外部调度器(systemd、launchd)的动作 |
cronjob --no-agent(本页) | 在 Hermes 调度下运行你的脚本 | 不需要推理的周期性看门狗 / 告警 / 指标 |
cronjob(默认,LLM) | 带可选预检查脚本的 Agent | 消息内容需要对数据进行推理时 |
系统 cron + curl 到 webhooks 订阅 | 在系统调度下运行你的脚本 | 当 Hermes 可能不健康时(你正在监控的对象) |
对于必须在网关宕机时也能触发的关键系统健康看门狗,请继续使用系统级 cron + 普通的 curl 或 hermes send 调用——这些作为独立的系统进程运行,不依赖 Hermes 是否正常运行。在 Hermes 内置调度器中安排任务,适合被监控对象是外部系统的场景。
相关文档
- 用定时任务实现自动化 — LLM 驱动的定时任务模式。
- 定时任务功能参考 — 完整的调度语法、生命周期、投递路由。
- 用
hermes send传输脚本输出 — 临时脚本的一次性对应方案。 - 网关内部机制 — 投递路由器内部实现。