Expressões Cron Explicadas: Guia Completo de Sintaxe
· 12 min de leitura
📑 Índice
- Anatomia de uma Expressão Cron
- Os Cinco Campos em Detalhe
- Caracteres Especiais Explicados
- Padrões Cron Comuns
- Padrões de Agendamento Avançados
- Trabalhando com Crontab
- Considerações sobre Fuso Horário
- Depuração de Tarefas Cron
- Melhores Práticas e Armadilhas
- Ferramentas de Teste e Validação
- Perguntas Frequentes
- Artigos Relacionados
Cron é o agendador de tarefas baseado em tempo em sistemas operacionais tipo Unix. Se você precisa executar um script à meia-noite, fazer backup de um banco de dados todo domingo, limpar arquivos temporários a cada hora ou enviar relatórios no primeiro dia de cada mês, cron é sua ferramenta. Mas sua sintaxe de expressão — aquelas strings enigmáticas como 0 */6 * * 1-5 — pode ser intimidante no início.
Este guia desmistifica completamente as expressões cron. Você aprenderá cada campo, cada caractere especial, verá dezenas de padrões do mundo real e entenderá as armadilhas de fuso horário que confundem até desenvolvedores experientes. Seja agendando backups, executando scripts de manutenção ou automatizando relatórios, dominar a sintaxe cron é essencial para qualquer desenvolvedor ou administrador de sistemas.
Anatomia de uma Expressão Cron
Uma expressão cron padrão tem cinco campos separados por espaços. Cada campo representa uma unidade de tempo e, juntos, eles definem exatamente quando sua tarefa deve ser executada.
┌───────────── minuto (0-59)
│ ┌─────────── hora (0-23)
│ │ ┌───────── dia do mês (1-31)
│ │ │ ┌─────── mês (1-12)
│ │ │ │ ┌───── dia da semana (0-6, Dom=0)
│ │ │ │ │
* * * * * comando a executar
Cada campo pode conter um número, um intervalo, uma lista, um valor de incremento ou um curinga. A beleza do cron é que esses blocos de construção simples se combinam para criar padrões de agendamento incrivelmente flexíveis.
Algumas implementações de cron suportam um sexto campo para segundos e um sétimo para ano, mas o formato padrão de cinco campos é universalmente suportado e é o que você encontrará na maioria dos sistemas tipo Unix, incluindo Linux, macOS e variantes BSD.
Os Cinco Campos em Detalhe
Entender o intervalo e o comportamento de cada campo é crucial para escrever expressões cron corretas. Vamos examinar cada um sistematicamente.
| Campo | Intervalo | Caracteres Especiais | Exemplo |
|---|---|---|---|
| Minuto | 0-59 | * , - / | */15 (a cada 15 min) |
| Hora | 0-23 | * , - / | 9-17 (9h às 17h) |
| Dia do Mês | 1-31 | * , - / L W | 1,15 (dia 1 e 15) |
| Mês | 1-12 ou JAN-DEZ | * , - / | 1-6 (Jan a Jun) |
| Dia da Semana | 0-6 ou DOM-SAB | * , - / L # | 1-5 (Seg a Sex) |
Campo Minuto (0-59)
O campo minuto controla em qual minuto da hora sua tarefa é executada. Um valor de 0 significa o início da hora, 30 significa meia hora, e 59 é o último minuto da hora.
Padrões comuns incluem */5 para a cada 5 minutos, 0,30 para duas vezes por hora, ou 15 para quinze minutos após cada hora.
Campo Hora (0-23)
As horas usam formato de 24 horas onde 0 é meia-noite, 12 é meio-dia e 23 é 23h. Esta é uma das fontes mais comuns de confusão para desenvolvedores acostumados com a notação AM/PM de 12 horas.
Horário comercial é tipicamente representado como 9-17 (9h às 17h), enquanto manutenção noturna pode usar 0-6 (meia-noite às 6h).
Campo Dia do Mês (1-31)
Este campo especifica qual dia do mês executar. Valores válidos são 1 a 31, embora nem todos os meses tenham 31 dias. O cron lida com isso graciosamente — se você especificar o dia 31 em fevereiro, a tarefa simplesmente não será executada naquele mês.
O caractere especial L significa "último dia do mês" e se ajusta automaticamente para o comprimento do mês e anos bissextos.
Campo Mês (1-12)
Os meses podem ser especificados numericamente (1 para janeiro até 12 para dezembro) ou usando abreviações de três letras (JAN, FEV, MAR, etc.). As abreviações não diferenciam maiúsculas de minúsculas na maioria das implementações.
Agendamentos trimestrais frequentemente usam padrões como 1,4,7,10 (janeiro, abril, julho, outubro) ou 3,6,9,12 para fins de trimestre fiscal.
Campo Dia da Semana (0-6)
Os dias da semana variam de 0 (domingo) a 6 (sábado). Alguns sistemas também aceitam 7 como domingo por conveniência. Abreviações de três letras (DOM, SEG, TER, etc.) também são suportadas.
O padrão mais comum é 1-5 para dias úteis (segunda a sexta-feira), enquanto 0,6 ou 6,0 representa fins de semana.
Dica profissional: Quando tanto o dia do mês quanto o dia da semana são especificados (não curingas), a tarefa é executada quando qualquer condição é atendida (lógica OU), não ambas. Isso pega muitos desenvolvedores desprevenidos. Por exemplo, 0 0 13 * 5 executa no dia 13 de cada mês e toda sexta-feira, não apenas sexta-feira 13.
Caracteres Especiais Explicados
Os caracteres especiais são o que dão às expressões cron seu poder e flexibilidade. Cada caractere serve a um propósito específico na definição de padrões de agendamento.
Asterisco (*) - Curinga
O asterisco significa "todos os valores possíveis" para aquele campo. É o caractere especial mais comumente usado e aparece em quase todas as expressões cron.
* * * * *— Executar a cada minuto de cada dia0 * * * *— Executar no início de cada hora0 0 * * *— Executar à meia-noite todos os dias
Vírgula (,) - Separador de Lista
As vírgulas permitem especificar múltiplos valores discretos. Isso é perfeito quando você precisa de horários específicos e não consecutivos.
0 9,12,15,18 * * *— Executar às 9h, meio-dia, 15h e 18h0 0 1,15 * *— Executar à meia-noite nos dias 1 e 15 de cada mês0 0 * * 1,3,5— Executar à meia-noite na segunda, quarta e sexta-feira
Hífen (-) - Operador de Intervalo
Os hífens definem intervalos inclusivos, facilitando a especificação de períodos contínuos.
0 9-17 * * *— Executar a cada hora das 9h às 17h0 0 * * 1-5— Executar à meia-noite de segunda a sexta-feira0 0 1-7 1 *— Executar diariamente durante a primeira semana de janeiro
Barra (/) - Valores de Incremento
A barra especifica intervalos de incremento, permitindo executar tarefas em intervalos regulares dentro de um intervalo. A sintaxe é início/incremento ou */incremento para todo o intervalo.
*/15 * * * *— A cada 15 minutos (0, 15, 30, 45)0 */2 * * *— A cada 2 horas (0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22)0 0 */3 * *— A cada 3 dias (1º, 4º, 7º, 10º, etc.)0 9-17/2 * * *— A cada 2 horas entre 9h e 17h (9, 11, 13, 15, 17)
Dica rápida: */15 não significa "a cada 15 minutos a partir de agora" — significa nos minutos 0, 15, 30 e 45 de cada hora. Se você adicionar uma tarefa cron às 10:07, um padrão */15 será executado primeiro às 10:15, não às 10:22.
L - Último Dia
O caractere L significa "último" e é usado nos campos dia do mês e dia da semana. É particularmente útil para processamento de fim de mês que precisa considerar comprimentos variáveis de mês.
0 0 L * *— Executar à meia-noite no último dia de cada mês0 0 * * L— Executar à meia-noite no último dia da semana (sábado)0 0 * * 5L— Executar na última sexta-feira de cada mês
W - Dia Útil Mais Próximo
O caractere W encontra o dia útil mais próximo de um determinado dia do mês. Se o dia especificado cair em um fim de semana, a tarefa é executada no dia útil mais próximo.
0 0 15W * *— Executar no dia útil mais próximo do dia 150 0 1W * *— Executar no primeiro dia útil do mês0 0 LW * *— Executar no último dia útil do mês
Cerquilha (#) - Enésimo Dia da Semana
O caractere cerquilha especifica a enésima ocorrência de um dia da semana dentro de um mês. A sintaxe é dia#ocorrência.
0 0 * * 1#1— Primeira segunda-feira de cada mês0 0 * * 5#2— Segunda sexta-feira de cada mês0 0 * * 3#4— Quarta quarta-feira de cada mês
Note que L, W e # não são suportados em todas as implementações de cron. Eles estão disponíveis em versões modernas como Vixie cron e na maioria dos agendadores baseados em nuvem, mas podem não funcionar em sistemas Unix mais antigos.
Padrões Cron Comuns
Vamos ver padrões de agendamento do mundo real que você usará regularmente. Estes exemplos cobrem os cenários de automação mais comuns.
A Cada Minuto, Hora e Dia
* * * * *— A cada minuto (use com moderação, pode criar problemas de carga)0 * * * *— A cada hora no minuto 00 0 * * *— Todos os dias à meia-noite0 12 * * *— Todos os dias ao meio-dia
Múltiplas Vezes Por Dia
0 0,12 * * *— Duas vezes ao dia à meia-noite e ao meio-dia0 */6 * * *— A cada 6 horas (0:00, 6:00, 12:00, 18:00)0 8,12,16,20 * * *— Quatro vezes ao dia em horários específicos*/30 * * * *— A cada 30 minutos
Agendamentos Semanais
0 0 * * 0— Todo domingo à meia-noite0 0 * * 1-5— Dias úteis à meia-noite0 9 * * 1— Toda segunda-feira às 9h0 0 * * 6,0— Fins de semana à meia-noite
Agendamentos Mensais
0 0 1 * *— Primeiro dia de cada mês à meia-noite0 0 L * *— Último dia de cada mês à meia-noite0 0 1,15 * *— Dias 1 e 15 de cada mês0 0 1 */3 *— Primeiro dia de cada trimestre (Jan, Abr, Jul, Out)
Horário Comercial e Janelas de Manutenção
0 9-17 * * 1-5— A cada hora durante horário comercial (9h-17h, Seg-Sex)*/15 9-17 * * 1-5— A cada 15 minutos durante horário comercial0 2 * * *— 2h diariamente (janela de manutenção comum)0 3 * * 0— 3h todo domingo (manutenção semanal)
| Caso de Uso | Expressão Cron | Descrição |
|---|---|---|
| Backup de banco de dados | 0 2 * * * |
Diariamente às 2h |
| Rotação de logs | 0 0 * * 0 |
Semanalmente no domingo à meia-noite |
| Limpeza de cache |