
1 つのサーバーで 60 のコンテナ
1 つのベアメタルボックスで数十から数百の Hoody コンテナを実行。KSM と BTRFS のデデュプでマージナルコストはほぼゼロ。
1 時間ごとのメトリクスエクスポートが 3 日間失敗し続けています。今夜はあなたがオンコールです。マネージド cron エントリに enabled:false を PATCH しましょう。スケジュール、コマンド、コメントはすべて残ります。ジョブは定義された状態にあります。存在しつつミュートされ、誰かの修正を待っています。
{ "enabled": false, "comment": "reindex flaking — see thread" }
トグルは PATCH 1 回 · エントリはリストから消えません
Hoody Cron のマネージドエントリは JSON リソースです。各行は id、schedule、command、comment、enabled フラグを持ちます。enabled を false に切り替えるのは PATCH 1 回。エントリは crontab に残るので、次の担当者が読んで判断できます。
# mute the flaky entry — entry stays in the crontab curl -X PATCH \ https://cron.containers.hoody.com/users/me/entries/e7d3 \ -H "Content-Type: application/json" \ -d '["enabled": false, "comment": "flaking on monday with prod-db — see #pager"]' # response HTTP/1.1 200 OK { "id":"e7d3", "enabled":false, "schedule":"0 * * * *", "command":"/srv/cron/metrics-export.sh", ... }
# the entry is still on the list — just not running curl GET https://cron.containers.hoody.com/users/me/entries HTTP/1.1 200 OK [ { "id":"a1f2", "enabled":true, ... }, { "id":"e7d3", "enabled":false, "comment":"flaking — see #pager" }, { "id":"9b21", "enabled":true, ... } ] # present and muted — the on-call hand-off has somewhere to point
PATCH はエントリを削除も、書き換えも、移動もしません。1 つの真偽値を反転させるだけです。引き継ぎは 1 行で済みます。「metrics-export entry e7d3 はミュート中、hoody-cron を見て確認してほしい」。
Hoody crontab 上のエントリは、常に 3 つのうちのいずれかひとつの状態にあります。それぞれの状態が、翌朝の「誰が何を知っているか」に異なる結果をもたらします。
エントリは crontab にあり、カーネルの cron デーモンが 1 時間ごとに拾います。失敗するとオンコールが起こされます。健全なジョブのデフォルトです。
enabled:false。エントリは crontab に残るので、チームはスケジュール、コマンド、コメントを読めます。cron デーモンはスキップします。明日の午前 2 時のページングはなく、誰もエントリの存在を忘れません。
DELETE すると、スケジュールも、コマンドも、コメントも、理由も、すべてが crontab から消えます。次のオンコールには grep する手がかりがありません。記憶を残すのはミュートという選択肢です。
ミュートは、ほとんどのスケジューラに名前がない中間状態です。Hoody Cron にはあります。enabled がマネージドエントリの一級フィールドだからです。
今夜ジョブを修正できないとき、問題は「明日までにその不在がどんな形を取るか」です。ミュートはその形を読み取れるようにします。
Slack スレッドや削除済み行の PR を貼る代わりに、メッセージはエントリ id だけ。明日のオンコールが cron URL を開き、コメントを読み、どこから始めるかが分かります。
GET /entries はコメントとともに enabled:false を返します。フィルタリングで監査パネルを構築できます。誰がミュートしたか、なぜか、どれくらい前かは JSON の中にあり、誰かの DM の中にはありません。
根本の問題が解消したら、もう 1 回 enabled:true で PATCH すればエントリはスケジュールに戻ります。cron 式を書き直す必要も、タイポのリスクも、コミットとデプロイのサイクルもありません。
数値は Hoody Cron のマネージドエントリ表面から得たもので、捏造したベンチマークではありません。
PATCH /users/[user]/entries/[id] は部分ボディを受け付けます。["enabled":false] だけを送ってください — schedule、command、comment はそのままです。
5 フィールドのスケジュール、command、comment、expires_at、id はミュートを越えて保持されます。カーネルの crontab にもエントリは反映されたまま — cron サービスがコメントアウトしているだけです。
ファイル編集も、PR も、デプロイもありません。ミュートの往復はどんなターミナルからでも HTTP 呼び出し 1 回 — スマホのターミナルでも構いません。
Hoody Cron Managed Entries API に基づく: 各エントリは schedule、command、comment、任意の expires_at と並んで enabled の真偽値を持ちます。PATCH は部分ボディを受け付けます。
Disabled は Deleted ではない — エントリは誰かの修正を待っている。
チームが不安定な cron 行を「一時的に」棚上げするときの典型的なやり方。どれも破壊的か、情報を失うか、本番から PR 2 回分離れています。
午前 2 時に不安定なジョブを削除するのはやめましょう。ミュートし、メモを残し、明日のオンコールに JSON を読ませましょう。