
一台服务器上运行 60 个容器
一个裸金属服务器运行数十到数百个 Hoody 容器。KSM 和 BTRFS 去重使边际成本接近零。
每小时的指标导出已经连续失败三天。今晚轮到你值班。给托管的 cron 条目 PATCH 一下 enabled:false——schedule、command、comment 全都保留。任务处于一个明确的状态:存在但被静音,等着有人来修复。
{ "enabled": false, "comment": "reindex flaking — see thread" }
切换只是一次 PATCH · 条目从未离开列表
Hoody Cron 的托管条目是一份 JSON 资源:每行有 id、schedule、command、comment 和一个 enabled 标志。把 enabled 翻成 false 就是一次 PATCH。条目继续留在 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 不会删除、重写或移动条目——只是翻一个布尔。交接只要一行:'metrics-export 条目 e7d3 已静音,见 hoody-cron,请看一下。'
Hoody crontab 上的一个条目永远恰好处于三种状态之一。每种状态对第二天早上谁知道什么有不同的后果。
条目在 crontab 里,内核 cron 守护进程每小时拾取一次。失败时唤醒值班。这是健康任务的默认状态。
enabled:false。条目仍在 crontab 里,团队能读到它的 schedule、command 和 comment。cron 守护进程跳过它。明天凌晨 2 点不会被叫醒,也不会有人忘了它的存在。
一旦 DELETE,schedule、command、comment、原因——全都离开 crontab。下一个值班无处可 grep。静音是那个保留记忆的选择。
静音是大多数调度器没有名字的中间态。Hoody Cron 有,因为 enabled 在托管条目上是一等公民字段。
今晚修不好任务时,问题是它的缺席在第二天会以什么形态呈现。静音让那个形态可读。
不用粘 Slack 串、也不用提交一行被删的 PR——消息就是那个条目 id。明天的值班打开 cron URL,读 comment,就知道从哪开始。
GET /entries 返回 enabled:false 以及 comment。靠过滤就能搭出一个审计面板。谁静音的、为什么、多久前——都在 JSON 里,而不是某人的私聊里。
底层问题修好后,再来一次 enabled:true 的 PATCH 就把条目放回排程。不用重写 cron 表达式、不冒打错字的风险、不走提交-发布的循环。
数字来自 Hoody Cron 的托管条目接口本身,不是编出来的基准。
PATCH /users/[user]/entries/[id] 接受部分 body。单独发送 ["enabled":false]——schedule、command、comment 完全不动。
五字段 schedule、command、comment、expires_at 和 id 在静音过程中全部保留。内核 crontab 仍然反映这个条目——只不过被 cron 服务注释掉了。
无文件编辑、无 PR、无发布。整个静音往返就是从任意终端发出的一次 HTTP 调用——包括手机上的那个。
依据 Hoody Cron 托管条目 API:每个条目除了 schedule、command、comment 和可选的 expires_at 之外,还带一个 enabled 布尔。PATCH 接受部分 body。
Disabled 不是 deleted——条目在等着有人来修。
团队通常用来「临时停掉」一行不稳定 cron 的几种方式。每一种要么具有破坏性、要么会丢信息、要么离生产还隔着两个 PR。
别再凌晨 2 点删除不稳定的任务。把它静音、留个备注,让明天的值班读 JSON。