H繁中版
<!-- Source: https://hermesbible.com/docs/guides/cron-script-only -->

僅限腳本的定時任務

有時候你已經完全知道要傳什麼訊息。你不需要代理程式來推理 — 你只需要一個腳本按計時器執行,其輸出(如果有的話)傳送到 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、非空 stdoutstdout 逐字傳送
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 + curlWebhook 訂閱你的腳本按 OS 排程執行當 Hermes 可能不健康時(你正在監控的對象)

對於即使閘道關閉也必須觸發的關鍵系統健康監控,使用 OS 級 cron 搭配對 Hermes Webhook 訂閱(或任何外部告警端點)的純 curl — 它們作為獨立的 OS 行程運行,不依賴 Hermes 運行中。閘道內排程器在被監控的對象是外部的時才是正確選擇。

相關



定時任務疑難排解