僅限腳本的定時任務
有時候你已經完全知道要傳什麼訊息。你不需要代理程式來推理 — 你只需要一個腳本按計時器執行,其輸出(如果有的話)傳送到 Telegram / Discord / Slack / Signal。
Hermes 將此稱為無代理模式。這是定時系統減去 LLM。
<!-- ascii-guard-ignore --> ┌──────────────────┐ ┌──────────────────┐
│ scheduler tick │ every │ run script │
│ (every N minutes)│ ──────▶ │ (bash or python) │
└──────────────────┘ └──────────────────┘
│
│ stdout
▼
┌──────────────────┐
│ delivery router │
│ (telegram/disc…) │
└──────────────────┘
<!-- ascii-guard-ignore-end -->
- 不呼叫 LLM。 零代幣、零代理迴圈、零模型花費。
- 腳本就是工作。 腳本決定是否要告警。輸出內容 → 傳送訊息。無輸出 → 靜默嘀嗒。
- Bash 或 Python。
.sh/.bash檔案在/bin/bash下執行;其他任何副檔名在當前 Python 直譯器下執行。~/.hermes/scripts/中的任何內容都會被接受。 - 相同的排程器。 與 LLM 工作一起存放在
cronjob中 — 暫停、恢復、列出、日誌和傳遞目標全部以相同方式運作。
何時使用
對以下情況使用無代理模式:
- 記憶體 / 磁碟 / GPU 監控。 每 5 分鐘執行一次,僅在閾值被突破時告警。
- CI 鉤子。 部署完成 → 發布提交 SHA。建置失敗 → 傳送日誌的最後 100 行。
- 定期指標。 「每天早上 9 點的 Stripe 營收」作為簡單的 API 呼叫 + 格式化輸出。
- 外部事件輪詢器。 檢查 API,狀態變更時告警。
- 心跳。 每 N 分鐘 ping 一次儀表板以證明主機存活。
當你需要代理程式決定說什麼時 — 摘要長文件、從 Feed 中挑選有趣的項目、草擬人類可讀的訊息 — 使用正常的(LLM 驅動的)定時任務。無代理路徑適用於腳本的 stdout 已經是訊息的情況。
從聊天中建立
無代理模式的真正優勢在於代理程式本身可以幫你設定監控 — 無需編輯器、無需終端機、無需記住 CLI 參數。你描述你想要的,Hermes 撰寫腳本、排程它,並告訴你何時會觸發。
範例對話記錄
你: 如果 RAM 超過 85%,每 5 分鐘用 Telegram 通知我
Hermes: (撰寫
~/.hermes/scripts/memory-watchdog.sh,然後以no_agent=true呼叫cronjob(...))已設定。每 5 分鐘執行,僅在 RAM 超過 85% 時告警 Telegram。腳本:
memory-watchdog.sh。工作 ID:abc123。
底層運作中,代理程式進行了兩次工具呼叫:
# 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
# Empty stdout = silent tick; no message sent.
''',
)
# 2. 排程它 — no_agent=True 在每次嘀嗒時跳過 LLM
cronjob(
action="create",
schedule="every 5m",
script="memory-watchdog.sh",
no_agent=True,
deliver="telegram",
name="memory-watchdog",
)
從那以後每次嘀嗒都是免費的:排程器執行腳本,如果 stdout 非空則將其導入 Telegram,永遠不會觸及模型。
代理程式為你決定的事項
當你用「當 X 時通知我」或「每 N 分鐘檢查 Y 並在 Z 時告訴我」這樣的措辭提出請求時,Hermes 的 cronjob 工具描述會告訴它在訊息內容完全由腳本決定時使用 no_agent=True。當請求需要推理時(「摘要新的 Issues」、「挑選最有趣的新聞標題」、「草擬友善的提醒」),它會回到正常的 LLM 驅動路徑。
你不需要自己指定 --no-agent。只要描述行為即可。
從聊天管理監控
代理程式可以用與建立相同的方式暫停、恢復、編輯和移除工作:
你: 今晚暫停記憶體監控
Hermes: (呼叫
cronjob(action='pause', job_id='abc123'))已暫停。用「重新開啟」或透過
hermes cron resume abc123恢復。
你: 改成每 15 分鐘
Hermes: (呼叫
cronjob(action='update', job_id='abc123', schedule='every 15m'))
完整的生命週期(建立 / 列出 / 更新 / 暫停 / 恢復 / 立即執行 / 移除)對代理程式可用,你無需學習任何 CLI 指令。
從 CLI 建立
偏好終端機?CLI 路徑用三個指令給你相同的結果:
# 1. 撰寫你的腳本
cat > ~/.hermes/scripts/memory-watchdog.sh <<'EOF'
#!/usr/bin/env bash
# Alert when RAM usage is over 85%. Silent otherwise.
RAM_PCT=$(free | awk '/^Mem:/ {printf "%d", $3 * 100 / $2}')
if [ "$RAM_PCT" -ge 85 ]; then
echo "⚠ RAM ${RAM_PCT}% on $(hostname)"
fi
# Empty stdout = silent run; no message sent.
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> # 執行一次來測試
就這樣。無需提示詞、無需技能、無需模型。
腳本輸出如何對應到傳遞
| 腳本行為 | 結果 |
|---|---|
| Exit 0、非空 stdout | stdout 逐字傳送 |
| Exit 0、空 stdout | 靜默嘀嗒 — 無傳遞 |
Exit 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 … # 切換回來
hermes cron remove <job_id> # 刪除它
所有適用於 LLM 工作的功能(暫停、恢復、手動觸發、傳遞目標變更)也適用於無代理工作。
實際範例:磁碟空間告警
cat > ~/.hermes/scripts/disk-alert.sh <<'EOF'
#!/usr/bin/env bash
# Alert when / or /home is over 90% full.
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% 時靜默;當一個檔案系統滿時精確地觸發一行。
與其他模式的比較
| 方法 | 執行什麼 | 何時使用 |
|---|---|---|
cronjob --no-agent(本頁) | 你的腳本按 Hermes 的排程執行 | 不需要推理的重複性監控 / 告警 / 指標 |
cronjob(預設,LLM) | 代理程式搭配可選的預檢查腳本 | 當訊息內容需要對資料進行推理時 |
OS cron + curl 到 Webhook 訂閱 | 你的腳本按 OS 排程執行 | 當 Hermes 可能不健康時(你正在監控的對象) |
對於即使閘道關閉也必須觸發的關鍵系統健康監控,使用 OS 級 cron 搭配對 Hermes Webhook 訂閱(或任何外部告警端點)的純 curl — 它們作為獨立的 OS 行程運行,不依賴 Hermes 運行中。閘道內排程器在被監控的對象是外部的時才是正確選擇。
相關
- 使用 Cron 自動化任何事 — LLM 驅動的定時模式。
- 定時任務 (Cron) 參考 — 完整排程語法、生命週期、傳遞路由。
- Webhook 訂閱 — 用於外部排程器的即發即忘 HTTP 入口。
- 閘道內部 — 傳遞路由器內部。