A Expressão 0 0 1 * *
A expressão cron 0 0 1 * * dispara no minuto 0, hora 0, no dia 1 de cada mês, independentemente de qual mês ou ano. O trabalho executa à meia-noite em 1 de janeiro, 1 de fevereiro, 1 de março, e assim por diante, exatamente 12 vezes por ano.
| Campo | Valor | Significado |
|---|---|---|
| Minuto | 0 | No início da hora |
| Hora | 0 | Meia-noite |
| Dia do mês | 1 | O dia 1 do mês |
| Mês | * | Todo mês |
| Dia da semana | * | Qualquer dia |
O Alias @monthly
@monthly é abreviação para 0 0 1 * *:
@monthly /opt/jobs/billing-cycle
# equivalente a:
0 0 1 * * /opt/jobs/billing-cycle
Casos Extremos com Valores de Dia do Mês
Meses com menos de 31 dias
Se você agendar um trabalho para o dia 29, 30 ou 31, ele será silenciosamente pulado para mêses que não têm esses dias:
| Expressão | Meses pulados |
|---|---|
0 0 29 * * | Fevereiro (maioria dos anos) |
0 0 30 * * | Fevereiro |
0 0 31 * * | Fev, Abr, Jun, Set, Nov |
Ano bissexto e 29 de fevereiro
0 0 29 * * pula fevereiro completamente em anos não bissextos.
O Problema do Último Dia do Mês
Solução prática: execute o trabalho diariamente e verifique a data no script:
#!/bin/bash
if [ "$(daté -d tomorrow +%d)" != "01" ]; then
exit 0
fi
# lógica real do trabalho aqui
Casos de Usó Reais para Cron Mensal
Faturamento e emissão de notas
Gerar faturas, processar renovações de assinatura ou recalcular cobranças baseadas em uso.
Relatórios mensais
Relatórios financeiros, de vendas e operacionais que consolidam dados do mês anterior.
Arquivamento de dados
Mover dados mais antigos que um mês para armazenamento frio.
Rotação de certificados e chaves
Rotacionar chaves de API, tokens de atualização ou segredos em cadência mensal.
Verificando o Agendamento
from croniter import croniter
from datetime import datetime
cron = croniter("0 0 1 * *", datetime.now())
for _ in range(6):
print(cron.get_next(datetime))