Script-Only Cron Jobs: Automate Without Burning Tokens
Script-Only Cron Jobs — easy-to-understand guide based on official docs
スクリプト専用Cronジョブ:トークンを消費せずに自動化する
Hermesのcronジョブを触ったことがあるなら、そのパワーはもうご存知ですよね。でも、ここで一つ質問です。LLMに「考える」必要がなくて、ただスケジュール通りに何かを実行して、結果を教えてくれればいいだけ、という場合はどうでしょう?
そこで登場するのがスクリプト専用cronジョブです。これは、まさに「余計な機能なし」の自動化レイヤーだと思ってください。同じスケジューラー、同じ配信機能、そしてLLMトークン消費はゼロ。
スクリプト専用Cronジョブはどんな時に使うべき?
スクリプト専用ジョブが真価を発揮するのは、スクリプト自体が、あなたが見たいと思っているメッセージを正確に生成できる場合です。推論は不要、要約も不要。ただ、純粋で決定的な出力だけが必要な時です。
典型的なユースケースはこちら:
- メモリ警告 – スクリプトがRAM使用率をチェックして「メモリ使用率92%」と出力
- ディスク容量警告 – 同じ考え方で、指標が違うだけ
- ハートビート – サービスがまだ生きている、その証拠を送る
- スクリプトが答えを知っているモニタリング全般 – 壊れていたら知らせる、問題なければ黙っている
その素晴らしさは、スクリプトの信頼性とHermesの配信力を組み合わせられる点です。トークンコストも、レイテンシも、「ちょっと考えさせて」という遅延もありません。
セットアップ方法
一番簡単な方法は? チャットでHermesに頼むだけです。cronjobツールは、no_agent=Trueをいつ使うべきかを賢く判断します。スクリプトを書いて、全てセットアップしてくれます。
でも、手動でやりたい場合は、こんな感じのパターンです:
/cron add "every 1h" "このプロンプトは使われません" --script ~/.hermes/scripts/my-check.py --name "マイモニター" --deliver telegram
ちょっと待って、このプロンプト、変に見えますよね。説明します。
スクリプトが語る
スクリプト専用cronジョブでは、スクリプトの標準出力(stdout)がそのままメッセージになります。LLMは介在しません。つまり、スクリプトは、配信したい内容を正確に出力する必要があるのです。
簡単な例を見てみましょう:
#!/usr/bin/env python3
import shutil
total, used, free = shutil.disk_usage("/")
percent = used / total * 100
if percent > 90:
print(f"⚠️ ディスク使用率 {percent:.1f}% — 今すぐ掃除してください!")
else:
print("[SILENT]")
最後にある[SILENT]、見えますか? これが魔法の「静音」マーカーです。Hermesは出力に[SILENT]を見つけると、何も送信しません。あなたを煩わせる価値があるかどうかを、スクリプト自身が決めるのです。
[SILENT] のトリック
これは、モニタリングスクリプトにとって最高の機能です。毎時間「全部順調です」と通知が来る代わりに、実際に注意が必要な時だけHermesから連絡が来るようになります。
スクリプトのロジックはこうです:
- 問題を検出? → アラートメッセージを出力
- 問題なし? →
[SILENT]を出力
後はHermesが処理します。静かな時間帯に通知は来ませんし、通知疲れもありません。「健康なサーバーなのに、なんで午前3時にスマホが鳴るんだ?」ということもなくなります。
スクリプト専用 vs. hermes send
もう一つ、トークン消費ゼロのオプションを知っておくと便利です:hermes sendです。これは、すでにどこかで実行されているスクリプト(CIステップ、コミット後フック、デプロイスクリプトなど)があって、その出力をTelegramやDiscordにパイプで送りたい、という場合に使います。
./my-deploy-script.sh | hermes send --channel telegram
違いは何でしょうか? スクリプト専用cronジョブは繰り返し実行される、スケジュールされたチェック用です。hermes sendは、スクリプトが「話す時だ」と判断した一回限りの瞬間用です。
実例:ウェブサイト変更モニター
全てを組み合わせてみましょう。これは、ウェブページを監視し、何か変更があった時だけ知らせるスクリプトです:
import hashlib, json, os, urllib.request
URL = "https://example.com/pricing"
STATE_FILE = os.path.expanduser("~/.hermes/scripts/.watch-state.json")
content = urllib.request.urlopen(URL, timeout=30).read().decode()
current_hash = hashlib.sha256(content.encode()).hexdigest()
prev_hash = None
if os.path.exists(STATE_FILE):
with open(STATE_FILE) as f:
prev_hash = json.load(f).get("hash")
with open(STATE_FILE, "w") as f:
json.dump({"hash": current_hash}, f)
if prev_hash and prev_hash != current_hash:
print(f"CHANGE DETECTED on {URL}")
print(f"Previous hash: {prev_hash}")
print(f"Current hash: {current_hash}")
print(f"\nFirst 2000 chars:\n{content[:2000]}")
else:
print("[SILENT]")
セットアップは次のように行います:
/cron add "every 1h" "unused" --script ~/.hermes/scripts/watch-site.py --name "価格モニター" --deliver telegram
スクリプトはページを取得し、ハッシュを比較し、違いがある時だけ通知します。LLMトークンも、ノイズもなし。純粋な自動化です。
まとめ
スクリプト専用cronジョブは、トークン消費ゼロの自動化の主力ツールです。以下のようなケースに最適です:
- 答えが二択であるような決定的なチェック
- 高頻度モニタリング(LLMコストがかさむ場合)
- LLMの解釈よりも、スクリプトの判断を信頼したいあらゆる場面
そして、何より素晴らしいのは、スクリプト専用ジョブとLLM搭載ジョブのどちらかを選ぶ必要がないことです。同じワークフロー内で混在させることができます。機械的なチェックにはスクリプトを使い、LLMにはもっと面白いこと、例えば、なぜそのウェブサイトの変更が重要なのかを要約させる、といった具合にです。
もっと深く知りたいですか? 完全なcronドキュメントやデイリーブリーフィングボットチュートリアルで、LLM搭載の側面もチェックしてみてください。
📖 公式ドキュメント
この記事は Hermes Agent の公式ドキュメントに基づいています:公式ドキュメント › guides/automate-with-cron