1. O Que E um Cron Job
Cron e um agendador de tarefas presente em sistemas Unix e Linux desde a decada de 1970. O nome vem de "chronos" (tempo em grego). Um "cron job" e uma tarefa — geralmente um script ou comando — que o sistema executa automaticamente em horarios definidos por uma expressao cron.
O cron daemon (crond) le um arquivo chamado "crontab" (cron table) que contem as definicoes de quais tarefas executar e quando. Cada linha do crontab e uma tarefa, composta pela expressao de agendamento seguida do comando a executar.
2. Sintaxe Detalhada da Expressao Cron
Uma expressao cron padrao tem 5 campos separados por espaco:
- Minuto (0-59): o minuto da hora em que a tarefa deve executar.
- Hora (0-23): a hora do dia (0 = meia-noite, 12 = meio-dia).
- Dia do mes (1-31): o dia especifico do mes.
- Mes (1-12): o mes do ano (alguns sistemas aceitam nomes: jan, feb...).
- Dia da semana (0-6): 0 = domingo, 1 = segunda, ..., 6 = sabado. Alguns sistemas aceitam 7 como domingo tambem.
Alem do asterisco (*), virgula (,), traco (-) e barra (/), alguns sistemas suportam caracteres especiais adicionais como L (ultimo dia do mes), W (dia de semana mais proximo) e # (enesimo dia da semana do mes).
"Dominar expressoes cron e uma das habilidades fundamentais de qualquer desenvolvedor backend ou DevOps — automatizar rotinas recorrentes e a base da eficiencia em producao."
3. Exemplos Praticos
*/5 * * * *— A cada 5 minutos. Util para health checks e polling de APIs.0 2 * * *— Todo dia as 2h. Clasico para backups noturnos.0 9 * * 1-5— Segunda a sexta as 9h. Ideal para relatorios diarios em dias uteis.0 0 1 * *— Primeiro dia de cada mes a meia-noite. Perfeito para fechamentos mensais.0 0 * * 0— Todo domingo a meia-noite. Limpeza semanal, renovacao de tokens, etc.30 23 L * *— No ultimo dia de cada mes as 23h30 (apenas em alguns schedulers como Quartz).
4. Cron em Ambientes Cloud e DevOps
O cron classico do Linux ainda e muito usado, mas em ambientes modernos de cloud e container, existem alternativas especializadas:
- AWS EventBridge (CloudWatch Events): suporta expressoes cron no formato AWS, com 6 campos (inclui segundo).
- Google Cloud Scheduler: usa expressoes cron padrao de 5 campos com fuso horario configuravel.
- GitHub Actions: o campo
scheduleaceita expressoes cron para executar workflows automaticamente. - Kubernetes CronJob: recurso nativo do Kubernetes para executar pods em horarios agendados, usando expressao cron padrao.
- Celery Beat (Python): agendador de tarefas distribuidas que aceita expressoes cron para agendar tasks.
5. Boas Praticas
- Redirecione a saida: use
> /dev/null 2>&1ou>> /var/log/task.logpara evitar emails do cron daemon. - Idempotencia: garanta que rodar o mesmo job duas vezes seguidas nao cause problemas.
- Bloqueio de concorrencia: use lock files ou ferramentas como
flockpara evitar execucoes concorrentes de jobs longos. - Monitoramento: configure alertas para detectar jobs que falharam ou nao rodaram quando esperado.
- Fuso horario: o cron padrao usa o horario do servidor. Em sistemas distribuidos, especifique o fuso explicitamente.
- Documentacao: adicione comentarios no crontab explicando o proposito de cada job.
6. Perguntas Frequentes
Qual a diferenca entre cron de 5 e 6 campos?
O cron padrao Unix usa 5 campos (minuto a dia da semana). Algumas implementacoes, como AWS EventBridge e Quartz Scheduler (Java), adicionam um 6o campo para segundos. Nossa ferramenta usa o formato padrao de 5 campos, compativel com a maioria dos sistemas.
Como o cron lida com horario de verao?
O comportamento depende do sistema. No Linux, o cron usa o horario local do sistema. Durante a transicao de horario de verao, um job agendado para um horario que "pula" pode nao executar, e um job agendado para um horario que "repete" pode executar duas vezes. Recomenda-se agendar tarefas criticas longe das transicoes (geralmente 2h ou 3h da madrugada).
Como verificar o crontab do meu servidor?
Use crontab -l para listar os jobs do usuario atual, crontab -e para editar, e sudo crontab -l para ver o crontab do root. Crontabs do sistema ficam em /etc/crontab e /etc/cron.d/.