
一台服务器上运行 60 个容器
一个裸金属服务器运行数十到数百个 Hoody 容器。KSM 和 BTRFS 去重使边际成本接近零。
在追一个时灵时不灵的 bug?让进程树每分钟 dump 一次,持续 48 小时,然后再也不跑。POST 一条托管 cron 条目,设上 expires_at——这条调度从此带半衰期。无需提醒,无需清理 PR,六个月后也不会留下陈旧条目。
{ "schedule": "* * * * *", "command": "pgrep auth | tee -a tree.log", "expires_at": "2026-05-06T11:14:00Z" }
POST /users/me/entries 带 expires_at——条目每分钟运行一次,到期自动删除
三个时刻。带截止时间创建条目。调度独立运行。到 expires_at,条目自行删除——你的 crontab 回到了开始调试之前的样子。
向 API 发送一条托管 cron 条目,带调度、命令以及 48 小时后的 expires_at 时间戳。返回一个 id,确认条目已启用。
条目按 cron 表达式的每个节拍执行——每分钟、每小时,你设什么就跑什么。行为与永久条目完全一致,只有一处低调的不同。
当墙钟越过 expires_at,条目被移除。无收尾运行,无僵尸行,无人工清理。GET /entries 返回的列表就像你从未来过。
无清理脚本。无日历提醒。六个月后也不会有谁问“这条是谁的?”的全员讨论串。条目知道自己什么时候该死,然后它就死了。
用 POST 创建条目。49 小时后用 GET 验证它已消失。整个机制就是两次 HTTP 调用加一个时间戳——无需 SSH 进 cron 守护进程,无需编辑 /etc/crontab。
# create a self-deleting cron entry curl -X POST \ https://cron.containers.hoody.com/api/v1/cron/users/me/entries \ -H "Content-Type: application/json" \ -d '["schedule":"* * * * *","command":"pgrep auth | tee -a tree.log","expires_at":"2026-05-06T11:14:00Z"]' # response HTTP/1.1 201 Created { "id":"e7d3", "expires_at":"2026-05-06T11:14:00Z", "enabled":true }
# 49 hours later — list is back to normal curl GET https://cron.containers.hoody.com/api/v1/cron/users/me/entries HTTP/1.1 200 OK [ { "id":"a1f2", "expires_at":null, ... }, { "id":"c4b9", "expires_at":null, ... }, { "id":"9b21", "expires_at":null, ... } ] # e7d3 was here. e7d3 deleted itself.
expires_at 字段就是契约。你不必记得清理,因为“记得”根本不在协议里——截止时间才是。
一旦调度有了过期时间,三件事就不再是你的问题:漂移、疏忽、审计疲劳。crontab 默认就保持干净。
每一条“我就临时加一下…”都内嵌截止时间。crontab 自我修剪——无需季度清理,无人想删的陈旧行也不会再出现,因为没人记得它们当年是干什么的。
你不必记得移除条目。不必设日历提醒。不必提清理 PR。截止时间就是提醒——而且永远会触发。
条目消失了,但运行记录还在。每次执行都有日志行、退出码、时间戳——“跑了 48 小时然后停了”这条线索事后完全可重建。
自过期条目的成本与永久条目相同。想堆多少就堆多少——这套 API 就是为团队里每位调试者同时跑三四条临时任务的场景设计的。
标准 cron 表达式,精度到分钟。expires_at 字段接受任意 RFC 3339 时间戳。
一队调试者每人在永久任务旁挂几个临时探针,空间绰绰有余。
无需记得 DELETE。待办列表里不会再有“清理旧 cron”的工单。条目自己处理生命终结。
上限随账号下 cron 服务等级扩展。条目过期后,日志按 Hoody Cron 标准保留窗口留存。
临时活,不该留下永久的 crontab 条目。
开发者需要一次性 cron 行时常用的几种套路。每一种都会留下尾巴。expires_at 把它们一并扫掉。
临时活,不该留下永久的 crontab 条目。