A Expressão 0 * * * *
A expressão cron 0 * * * * executa um trabalho no minuto 0 de cada hora. Os cinco campos são minuto, hora, dia do mês, mês, dia da semana. Definir o minuto como 0 e usar * para todo o resto significa que o trabalho dispara às 00:00, 01:00, 02:00, e assim por diante, exatamente 24 vezes por dia.
Por que o Campo de Minuto Importa
A maior fonte única de trabalhos cron acidentalmente descontrolados é confundir * * * * * com 0 * * * *.
* * * * * # executa a cada minuto, 1440 vezes/dia
0 * * * * # executa a cada hora, 24 vezes/dia
Se você quer um trabalho horário e escreve * * * * *, você não notará o problema até verificar seus logs e perceber que ele está executando o dia todo. Sempre verifique duas vezes o campo de minuto para agendamentos horários.
O Atalho @hourly
A maioria das implementações cron suporta um conjunto de atalhos @:
| Atalho | Equivalente |
|---|---|
@hourly | 0 * * * * |
@daily | 0 0 * * * |
@weekly | 0 0 * * 0 |
@monthly | 0 0 1 * * |
@yearly | 0 0 1 1 * |
@reboot | executa uma vez na inicialização |
Distribuindo Trabalhos Horários
Se você tem múltiplos serviços executando trabalhos horários, agendar todos às 0 * * * * cria um pico de carga no início de cada hora.
A solução é deslocar cada trabalho por alguns minutos:
0 * * * * /opt/jobs/report-generator
7 * * * * /opt/jobs/cache-warmer
14 * * * * /opt/jobs/data-sync
21 * * * * /opt/jobs/cleanup
Quando Horário é a Escolha Certa
Geração de relatórios
Resumos horários são um limite natural para dashboards mostrando métricas da “última hora”.
Sincronização de API externa
Se você puxa dados de um serviço externo e os dados mudam no máximo uma vez por hora, fazer polling mais frequente desperdiça cota.
Atualização de token ou sessão
Credentials de curta duração que expiram a cada poucas horas podem ser renovadas numa base horária como margem de segurança.
Tarefas de limpeza
Deletar arquivos temporários, purgar entradas de cache expiradas ou arquivar registros antigos é frequentemente feito por hora.
Confirmando os Próximos Horários de Execução
from croniter import croniter
from datetime import datetime
cron = croniter("0 * * * *", datetime.now())
for _ in range(5):
print(cron.get_next(datetime))