Pular para o conteúdo
use-cases / cleanup-jobs-self-retire / hero
CRON · ARQUIVOS · AUTO-APOSENTÁVEL

Jobs de limpeza que agendam a própria aposentadoria

Provisione uma entrada gerenciada de cron no dia em que a limpeza começa. Defina expires_at alguns dias após a última execução prevista. O script vai fatiando o trabalho noite após noite e então faz DELETE em si mesmo quando não sobra nada. Sem lembrete no calendário, sem crontab zumbi, sem revisão anual de limpa-os-limpadores.

Documentação do cron
cleanup-stale-uploads.sh
# tail of cleanup-stale-uploads.sh
removed=$(find /uploads -mtime +90 -delete -print | wc -l)
echo "$removed files removed"

# self-aware tail: nothing left → retire
if [ -z "$(ls /uploads)" ]; then
  curl -fsS -X DELETE \
    "$CRON_URL/entries/$ENTRY_ID"
fi

A cauda autoconsciente. A entrada de cron é a última linha do próprio script.

use-cases / cleanup-jobs-self-retire / lifecycle

Uma limpeza com tempo de vida finito, por construção

Três fases discretas. Cada transição é mecânica, nenhuma exige que um humano se lembre. A entrada sabe quando seu trabalho terminou e quando seu slot no calendário acabou.

CICLO DE VIDA · AGENDAR → FATIAR → AUTO-DELETARUMA ENTRADA, UMA VIDA FINITA
1 · AGENDAR

POST de uma entrada no dia em que a limpeza começa

Agendamento @daily, comando aponta para um script slicer, expires_at é definido um pouco após a última execução prevista. O prazo está na entrada — não num doc do Notion, não numa thread do Slack.

2 · FATIAR

O script vai chipando à noite, com calma

Cada execução deleta uma fatia de dados obsoletos para que o banco não seja martelado. Dia 1 pode limpar 247 arquivos; dia 6, só 1. O ritmo é limitado pelo que de fato resta.

3 · AUTO-DELETAR

Quando o trabalho termina, a entrada se aposenta

O último bloco do script verifica se o alvo está vazio. Se sim, dispara DELETE /entries/[self]. Se de alguma forma não disparar, expires_at aciona a rede de segurança alguns dias depois.

Dois gatilhos independentes — a verificação do próprio script e o expires_at da API — convergem para o mesmo resultado: uma linha de crontab que não sobrevive ao seu propósito.

use-cases / cleanup-jobs-self-retire / mechanism

Duas chamadas HTTP, uma limpeza finita

O Hoody Cron é um wrapper JSON-CRUD em torno do crontab do sistema. POST cria a entrada; DELETE remove; expires_at é a rede de segurança. O script que roda à noite é o que sabe quando terminou — então é ele quem chama o DELETE.

create-entry.sh
DIA 0 · POST
# day 0 — provision the cleanup
curl -X POST \
  https://cron.containers.hoody.com/users/me/entries \
  -H "Content-Type: application/json" \
  -d '["schedule":"@daily","command":"/srv/jobs/cleanup-stale-uploads.sh","expires_at":"2026-05-05T00:00:00Z"]'

# response
HTTP/1.1 201 Created
{ "id":"f3a1", "expires_at":"2026-05-05T00:00:00Z", "enabled":true }
cleanup-stale-uploads.sh
DIA 7 · DELETE
# inside the cron command itself
if [ -z "$(ls /uploads)" ]; then
  curl -X DELETE \
    "$CRON_URL/entries/$ENTRY_ID"
fi

# response
HTTP/1.1 204 No Content
# entry f3a1 was here. f3a1 deleted itself.

$ENTRY_ID é o UUID retornado pelo POST — o script pode lê-lo de um arquivo passado pela linha de comando da entrada, ou de $HOODY_ENTRY_ID em runtime. De qualquer forma, a entrada de cron deleta a entrada de cron.

use-cases / cleanup-jobs-self-retire / powers

O que a limpeza autoaposentável destrava

Não é a deleção que importa. É que ninguém precisa lembrar que nada disso existe daqui a três meses.

RITMO SEM PRESSÃO

Fatia por fatia, não tudo de uma vez

@daily roda a cada 24 horas. O script deleta uma fatia de dados obsoletos — alguns milhares de arquivos, alguns milhares de linhas — e encerra. O banco fica calmo; a curva de carga parece que nada aconteceu.

SEM CRONTAB ZUMBI

A linha não sobrevive ao engenheiro

expires_at está na entrada como JSON. Quando dispara, a linha é removida do crontab do sistema. Daqui a três engenheiros ninguém vai estar passando por 200 linhas se perguntando o que cleanup-stale-uploads-v3 ainda faz.

DOIS GATILHOS, UM RESULTADO

Auto-DELETE mais rede de segurança expires_at

O script faz DELETE em si mesmo na noite em que o trabalho acaba. Se um bug pula esse caminho, expires_at aposenta a entrada alguns dias depois. Dois mecanismos independentes; um deles vai disparar.

use-cases / cleanup-jobs-self-retire / capacity

Como isto escala

Cada entrada gerenciada é uma linha de JSON que a API injeta no crontab do sistema. A escala é limitada pelo que o próprio cron suporta, não pelo Hoody.

  1. CADÊNCIA DE EXECUÇÃO1 / dia

    @daily é o ritmo canônico de limpeza. Se você precisa de passagens mais frequentes, pode usar expressões de 5 campos até * * * * * — resolução por minuto.

  2. TEMPO DE VIDA DA ENTRADAexpires_at

    Um timestamp ISO-8601 na entrada. Quando passa, a API remove a linha na próxima varredura. A limpeza nunca demora além do próprio prazo.

  3. TEARDOWN HTTPDELETE · 204

    DELETE /users/[user]/entries/[id] de dentro do comando em execução funciona porque o daemon do cron não trava o próprio crontab — a API aplica a mudança com segurança.

Expressões padrão de cron de 5 campos mais macros (@hourly, @daily, @weekly, @monthly, @yearly). Isolamento por usuário; cada usuário do sistema tem seu próprio crontab. A página de Cron do Hoody Kit documenta tanto entradas gerenciadas quanto acesso bruto ao crontab, caso você precise do formato antigo.

use-cases / cleanup-jobs-self-retire / punchline

A limpeza roda toda noite até que aquilo que está sendo limpo tenha sumido.

ANTES · LEMBRETES NO CALENDÁRIO, LINHAS DE CRON ZUMBISDEPOIS · UMA ENTRADA DE CRON QUE SABE QUANDO TERMINOU
ANTES// TODO: deletar isto quando /uploads estiver vazio (2026?)Um comentário que seu eu futuro vai ler uma vez e nunca mais.
AGORADELETE /entries/$ENTRY_ID · expires_at: 2026-05-05Um teardown que dispara do script e um prazo codificado na própria entrada.
use-cases / cleanup-jobs-self-retire / replaces

O que isto substitui

Onde quer que uma tarefa de limpeza deva sumir sozinha — esses são os padrões que ela substitui:

  • Cron jobs zumbis de limpezaLinhas de 2022 que ninguém ousa deletar
  • // TODO: deletar isto quando X estiver vazioUm comentário que virou permanente
  • Scripts de zelador manuaisUm colega roda trimestralmente, quando lembra
  • Kubernetes CronJobs que nunca se deletamttlSecondsAfterFinished no pod, não no agendamento
  • Gerenciadores de ciclo de vida feitos em casaUm serviço caseiro que vigia seus outros serviços
  • Políticas de ciclo de vida gerenciadas por TerraformPlan, apply, seis meses depois ainda no tfstate
use-cases / cleanup-jobs-self-retire / cta

Provisione a limpeza. Defina sua data de aposentadoria. Vá embora.

use-cases / cleanup-jobs-self-retire / related

Leia os outros