Pular para o conteúdo
use-cases / cron-that-expires-itself / hero
HOODY CRON / ENTRADAS AUTO-EXPIRÁVEIS

O cron job que se apaga sozinho quando você termina

Caçando um bug intermitente? Faça um dump da árvore de processos a cada minuto durante 48 horas, e nunca mais. Faça POST em uma entrada gerenciada de cron com expires_at definido, e o agendamento ganha meia-vida — sem lembrete, sem PR de limpeza, sem entrada órfã seis meses depois.

Leia a documentação
use-cases / cron-that-expires-itself / lifecycle

Um agendamento com meia-vida

Três momentos. Crie a entrada com um prazo. O agendamento roda por conta própria. Em expires_at, a entrada se apaga sozinha — e seu crontab volta ao que era antes de você começar a depurar.

Ciclo de vida de uma entrada auto-expirávelcriar → rodar → expirar
01 / CRIAR

POST com expires_at

Envie uma entrada gerenciada de cron para a API com schedule, command e um timestamp expires_at 48 horas adiante. Você recebe de volta um id e a confirmação de que a entrada está habilitada.

02 / RODAR

Roda no horário

A entrada executa a cada tique da expressão cron — a cada minuto, a cada hora, o que você definir. Comportamento idêntico ao de uma entrada permanente, com uma diferença silenciosa.

03 / EXPIRAR

Apaga-se sozinha no prazo

Quando o relógio cruza expires_at, a entrada é removida. Sem execução final, sem linha zumbi, sem limpeza manual. GET /entries devolve a lista que devolveria sem você.

Sem script de limpeza. Sem lembrete no calendário. Sem aquela thread coletiva de "quem é o dono disso?" daqui a seis meses. A entrada sabia quando deveria morrer e morreu.

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

Dois curls e um relógio

Crie a entrada com um POST. Verifique que ela sumiu com um GET 49 horas depois. O mecanismo todo são duas chamadas HTTP e um timestamp — sem daemon de cron pra entrar via SSH, sem /etc/crontab pra editar.

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.

O campo expires_at é o contrato. Você não precisa lembrar de limpar porque lembrar não faz parte do protocolo — o prazo faz.

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

O que a meia-vida destrava

Quando o agendamento tem data de expiração, três coisas deixam de ser seu problema: deriva, supervisão e fadiga de auditoria. O crontab fica limpo por padrão.

SEM DERIVA

O crontab não consegue acumular

Toda entrada "vou colocar só temporariamente…" já vem com prazo embutido. O crontab se autopoda — sem varredura trimestral de limpeza, sem linhas órfãs que ninguém quer apagar porque ninguém sabe o que faziam.

SEM SUPERVISÃO

Esquecer está tudo bem

Você não precisa lembrar de remover a entrada. Não precisa marcar lembrete no calendário. Não precisa abrir um PR de limpeza. O prazo é o lembrete — e ele sempre dispara.

AUDITÁVEL

Os logs sobrevivem à entrada

A entrada se foi, mas as execuções não. Toda execução ainda tem sua linha de log, código de saída e timestamp — então o rastro de "isso rodou por 48 horas e depois parou" é totalmente reconstruível depois do fato.

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

Barato, rápido, plural

Entradas auto-expiráveis custam o mesmo que as permanentes. Empilhe quantas precisar — a API foi feita para o caso em que cada pessoa do time depurando tem três ou quatro jobs temporários rodando ao mesmo tempo.

  1. GRANULARIDADE MÍN.1 min

    Expressões cron padrão, até a resolução de um minuto. O campo expires_at aceita qualquer timestamp RFC 3339.

  2. POR CONTA100s

    Espaço de sobra para um time de pessoas depurando, cada uma rodando um punhado de sondas temporárias junto dos jobs permanentes.

  3. PASSOS MANUAIS0 limpeza

    Nenhuma chamada DELETE pra lembrar. Nenhum ticket de "limpar crons antigos" no backlog. A entrada cuida do próprio fim de vida.

Os limites escalam com o tier do serviço de cron na sua conta. Os logs são retidos pela janela padrão de retenção do Hoody Cron depois que a própria entrada expirou.

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

Trabalho temporário não deveria deixar entradas permanentes no crontab.

o jeito antigoo jeito de meia-vida
SEM expires_atecho '* * * * * pgrep auth …' >> /etc/crontabe um lembrete no calendário que você vai ignorar
COM expires_atPOST /entries [ expires_at: "+48h" ]o agendamento se apaga sozinho no prazo
Leia a documentação
use-cases / cron-that-expires-itself / replaces

O que isso substitui

Os padrões para os quais as pessoas desenvolvedoras correm quando precisam de uma linha de cron one-shot. Cada um deixa rastro. expires_at varre tudo.

  • Poda manual de crontabUm grep semanal por comentários "DELETE_AFTER"
  • Notas "TODO: remover isso"Post-it no monitor. Desbota depois de uma sprint.
  • Lifecycle de cron no TerraformDois PRs para agendar trabalho avulso
  • Jobs zeladores customizadosUm segundo cron cujo único trabalho é matar o primeiro
  • Threads de lembrete no SlackUm humano futuro como seu coletor de lixo
  • Issue no GitHub + auto-auditoria de cronUma reunião semanal para falar de linhas de cron
use-cases / cron-that-expires-itself / cta

Trabalho temporário não deveria deixar entradas permanentes no crontab.

Leia a documentação
use-cases / cron-that-expires-itself / related

Leia os outros