跳转到内容
use-cases / cron-that-expires-itself / hero
HOODY CRON / 自过期条目

干完活就自动删掉自己的定时任务

在追一个时灵时不灵的 bug?让进程树每分钟 dump 一次,持续 48 小时,然后再也不跑。POST 一条托管 cron 条目,设上 expires_at——这条调度从此带半衰期。无需提醒,无需清理 PR,六个月后也不会留下陈旧条目。

阅读文档
use-cases / cron-that-expires-itself / lifecycle

带半衰期的调度

三个时刻。带截止时间创建条目。调度独立运行。到 expires_at,条目自行删除——你的 crontab 回到了开始调试之前的样子。

自过期条目的生命周期create → run → expire
01 / CREATE

POST 带 expires_at

向 API 发送一条托管 cron 条目,带调度、命令以及 48 小时后的 expires_at 时间戳。返回一个 id,确认条目已启用。

02 / RUN

按调度运行

条目按 cron 表达式的每个节拍执行——每分钟、每小时,你设什么就跑什么。行为与永久条目完全一致,只有一处低调的不同。

03 / EXPIRE

到期自行删除

当墙钟越过 expires_at,条目被移除。无收尾运行,无僵尸行,无人工清理。GET /entries 返回的列表就像你从未来过。

无清理脚本。无日历提醒。六个月后也不会有谁问“这条是谁的?”的全员讨论串。条目知道自己什么时候该死,然后它就死了。

use-cases / cron-that-expires-itself / mechanism

两条 curl 加一个时钟

用 POST 创建条目。49 小时后用 GET 验证它已消失。整个机制就是两次 HTTP 调用加一个时间戳——无需 SSH 进 cron 守护进程,无需编辑 /etc/crontab。

create.sh
POST
# 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 }
verify.sh
GET
# 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 字段就是契约。你不必记得清理,因为“记得”根本不在协议里——截止时间才是。

use-cases / cron-that-expires-itself / powers

半衰期解锁了什么

一旦调度有了过期时间,三件事就不再是你的问题:漂移、疏忽、审计疲劳。crontab 默认就保持干净。

无漂移

crontab 不会再堆积

每一条“我就临时加一下…”都内嵌截止时间。crontab 自我修剪——无需季度清理,无人想删的陈旧行也不会再出现,因为没人记得它们当年是干什么的。

无疏忽

忘了也没事

你不必记得移除条目。不必设日历提醒。不必提清理 PR。截止时间就是提醒——而且永远会触发。

可审计

日志比条目活得久

条目消失了,但运行记录还在。每次执行都有日志行、退出码、时间戳——“跑了 48 小时然后停了”这条线索事后完全可重建。

use-cases / cron-that-expires-itself / capacity

便宜、快、可批量

自过期条目的成本与永久条目相同。想堆多少就堆多少——这套 API 就是为团队里每位调试者同时跑三四条临时任务的场景设计的。

  1. 最小粒度1 分钟

    标准 cron 表达式,精度到分钟。expires_at 字段接受任意 RFC 3339 时间戳。

  2. 每账号数百

    一队调试者每人在永久任务旁挂几个临时探针,空间绰绰有余。

  3. 人工步骤0 清理

    无需记得 DELETE。待办列表里不会再有“清理旧 cron”的工单。条目自己处理生命终结。

上限随账号下 cron 服务等级扩展。条目过期后,日志按 Hoody Cron 标准保留窗口留存。

use-cases / cron-that-expires-itself / punchline

临时活,不该留下永久的 crontab 条目。

旧办法半衰期办法
WITHOUT expires_atecho '* * * * * pgrep auth …' >> /etc/crontab外加一条你会忽略的日历提醒
WITH expires_atPOST /entries [ expires_at: "+48h" ]调度到截止时间自动删除
阅读文档
use-cases / cron-that-expires-itself / replaces

它替代了什么

开发者需要一次性 cron 行时常用的几种套路。每一种都会留下尾巴。expires_at 把它们一并扫掉。

  • 手动修剪 crontab每周 grep 一次 "DELETE_AFTER" 注释
  • "TODO: remove this" 便签贴在显示器上,一个迭代周期后褪色
  • Terraform cron 生命周期为一次性任务提两个 PR
  • 自定义清道夫任务第二个 cron 唯一的工作就是杀掉第一个
  • Slack 提醒线程把未来的同事当垃圾回收器
  • GitHub issue + cron 自审每周开个会,聊聊 cron 行
use-cases / cron-that-expires-itself / cta

临时活,不该留下永久的 crontab 条目。

阅读文档
use-cases / cron-that-expires-itself / related

阅读其他内容