Expressões Cron Explicadas: Sintaxe, Exemplos e Padrões Comuns
· 12 min de leitura
Cron é o agendador de tarefas baseado em tempo que alimenta a automação em sistemas operacionais tipo Unix. Seja fazendo backup de bancos de dados, enviando e-mails agendados ou executando scripts de manutenção, entender expressões cron é essencial para qualquer desenvolvedor ou administrador de sistemas.
Este guia abrangente detalha tudo o que você precisa saber sobre sintaxe cron, desde padrões básicos até técnicas avançadas de agendamento. Você aprenderá a escrever, testar e solucionar problemas de expressões cron com confiança.
Índice
- Entendendo o Básico do Cron
- Sintaxe Cron: Os Cinco Campos
- Caracteres Especiais e Operadores
- Padrões Comuns de Cron
- Técnicas Avançadas de Agendamento
- Gerenciando Seu Crontab
- Variáveis de Ambiente e Caminhos
- Armadilhas Comuns e Como Evitá-las
- Depurando Tarefas Cron
- Alternativas Modernas ao Cron
- Perguntas Frequentes
- Artigos Relacionados
Entendendo o Básico do Cron
Cron é um processo daemon que roda continuamente em segundo plano de sistemas tipo Unix, verificando a cada minuto se há tarefas agendadas para executar. O nome vem da palavra grega "chronos", que significa tempo.
Cada usuário em um sistema pode ter seu próprio arquivo crontab (tabela cron) contendo tarefas agendadas. O sistema também mantém crontabs para tarefas em nível de sistema em diretórios como /etc/cron.d/, /etc/cron.daily/ e /etc/cron.hourly/.
Quando uma tarefa cron é executada, ela roda com as permissões do usuário que possui o crontab. Isso é crucial para considerações de segurança e acesso a arquivos. A tarefa roda em um ambiente mínimo sem sua configuração de shell usual, o que é uma fonte comum de confusão para iniciantes.
Dica profissional: Tarefas cron não têm acesso ao seu ambiente de shell interativo. Sempre use caminhos absolutos para comandos e arquivos, e defina explicitamente quaisquer variáveis de ambiente necessárias em seu crontab.
Sintaxe Cron: Os Cinco Campos
Uma expressão cron padrão consiste em cinco campos de data e hora seguidos pelo comando a executar. Entender esses campos é fundamental para escrever agendamentos cron eficazes.
┌───────────── minuto (0-59)
│ ┌───────────── hora (0-23)
│ │ ┌───────────── dia do mês (1-31)
│ │ │ ┌───────────── mês (1-12 ou JAN-DEZ)
│ │ │ │ ┌───────────── dia da semana (0-7, 0 e 7 = Domingo, ou DOM-SAB)
│ │ │ │ │
* * * * * comando a executar
Cada campo aceita valores específicos e caracteres especiais que controlam quando a tarefa é executada. Vamos detalhar o que cada campo representa:
| Campo | Intervalo | Caracteres Especiais | Descrição |
|---|---|---|---|
| Minuto | 0-59 | * , - / | O minuto exato em que a tarefa é executada |
| Hora | 0-23 | * , - / | Hora no formato de 24 horas (0 = meia-noite) |
| Dia do Mês | 1-31 | * , - / L W | O dia do mês |
| Mês | 1-12 ou JAN-DEZ | * , - / | Mês do ano (1 = Janeiro) |
| Dia da Semana | 0-7 ou DOM-SAB | * , - / L # | Dia da semana (0 e 7 = Domingo) |
O campo de comando pode ser qualquer comando shell válido, caminho de script ou série de comandos separados por ponto e vírgula. A saída de tarefas cron é normalmente enviada por e-mail ao usuário, a menos que seja redirecionada.
Caracteres Especiais e Operadores
O poder do Cron vem de seus caracteres especiais que permitem padrões de agendamento flexíveis. Dominar esses operadores permite criar agendamentos sofisticados sem lógica complexa.
O Asterisco (*) - Corresponde a Todos os Valores
O asterisco é o caractere curinga que corresponde a todos os valores possíveis para um campo. Quando você usa * em um campo, a tarefa é executada para cada valor no intervalo desse campo.
Por exemplo, * * * * * significa "cada minuto de cada hora de cada dia de cada mês em cada dia da semana" - em outras palavras, a cada minuto.
A Vírgula (,) - Lista Múltiplos Valores
Vírgulas permitem especificar múltiplos valores discretos. Isso é útil quando você precisa de horários específicos e não consecutivos.
Exemplo: 0 9,12,15,18 * * * executa às 9h, meio-dia, 15h e 18h todos os dias.
O Hífen (-) - Define Intervalos
Hífens criam intervalos inclusivos de valores. Isso é mais limpo do que listar muitos valores consecutivos com vírgulas.
Exemplo: 0 9-17 * * 1-5 executa a cada hora das 9h às 17h, de segunda a sexta-feira (horário comercial).
A Barra (/) - Valores de Passo
O operador barra especifica intervalos de passo. A sintaxe é */n ou intervalo/n onde n é o valor do passo.
Exemplo: */15 * * * * executa a cada 15 minutos (às :00, :15, :30, :45). Você também pode usar intervalos: 0-30/5 * * * * executa a cada 5 minutos durante a primeira metade de cada hora.
Caracteres Estendidos (L, W, #)
Estas são extensões não padrão suportadas por algumas implementações de cron como Vixie cron e o agendador Quartz, mas não pelo cron Unix padrão.
| Caractere | Significado | Exemplo | Descrição |
|---|---|---|---|
L |
Último | 0 0 L * * |
Último dia do mês à meia-noite |
W |
Dia útil | 0 0 15W * * |
Dia útil mais próximo do dia 15 |
# |
N-ésima ocorrência | 0 0 * * 5#3 |
Terceira sexta-feira de cada mês |
Dica rápida: Antes de usar os caracteres L, W ou #, verifique se sua implementação de cron os suporta. O cron Unix padrão rejeitará essas expressões. Use nosso Gerador de Expressões Cron para testar a compatibilidade.
Padrões Comuns de Cron
Aqui estão os padrões cron mais usados que você encontrará em aplicações do mundo real. Estes cobrem a maioria das necessidades de agendamento para tarefas típicas de automação.
Intervalos de Tempo Básicos
* * * * *- A cada minuto (use com moderação, pode criar alta carga)*/5 * * * *- A cada 5 minutos*/10 * * * *- A cada 10 minutos*/15 * * * *- A cada 15 minutos (comum para scripts de monitoramento)*/30 * * * *- A cada 30 minutos0 * * * *- A cada hora em ponto0 */2 * * *- A cada 2 horas0 */4 * * *- A cada 4 horas0 */6 * * *- A cada 6 horas (quatro vezes ao dia)
Agendamentos Diários
0 0 * * *- Diariamente à meia-noite (comum para backups e relatórios)0 2 * * *- Diariamente às 2:00 (horário de baixo tráfego para manutenção)0 9 * * *- Diariamente às 9:00 (início do horário comercial)30 4 * * *- Diariamente às 4:300 0,12 * * *- Duas vezes ao dia à meia-noite e ao meio-dia0 8,20 * * *- Duas vezes ao dia às 8h e às 20h
Agendamentos Semanais
0 0 * * 0- Semanalmente aos domingos à meia-noite0 0 * * 1- Semanalmente às segundas-feiras à meia-noite0 9 * * 1-5- Dias úteis às 9:000 0 * * 6,0- Fins de semana (sábado e domingo) à meia-noite30 4 * * 1- Toda segunda-feira às 4:30 (relatórios semanais)0 8-17 * * 1-5- A cada hora durante o horário comercial (9h - 17h, seg-sex)
Agendamentos Mensais e Anuais
0 0 1 * *- Primeiro dia de cada mês à meia-noite0 0 15 * *- Dia 15 de cada mês à meia-noite0 0 1,15 * *- Dias 1 e 15 de cada mês (quinzenal)0 0 * * 0- Todo domingo (semanal)0 0 1 1 *- 1º de janeiro à meia-noite (anual)0 0 1 */3 *- Primeiro dia de cada trimestre (jan, abr, jul, out)0 0 1 6,12 *- 1º de junho e 1º de dezembro (semestral)
Dica profissional: Ao agendar tarefas mensais, tenha cuidado com valores de dia do mês acima de 28. Usar 0 0 31 * * só será executado em meses com 31 dias. Para tarefas de fim de mês, considere usar o último dia do mês anterior ou o primeiro dia do próximo mês.
Teste e valide suas expressões cron usando nosso Analisador de Expressões Cron para ver exatamente quando suas tarefas serão executadas.
Técnicas Avançadas de Agendamento
Além dos padrões básicos, você pode combinar operadores e campos para criar agendamentos sofisticados que atendem a requisitos de negócios complexos.
Combinando Múltiplas Condições
Você pode usar múltiplos operadores em um único campo para criar agendamentos diferenciados. Por exemplo, 0 9,12,15 * * 1-5 executa às 9h, meio-dia e 15h, mas apenas em dias úteis.
Outro exemplo: */10 8-17 * * 1-5 executa a cada 10 minutos, mas apenas durante o horário comercial (8h às 17h) em dias úteis.
Dia do Mês vs Dia da Semana
Quando tanto o dia do mês quanto o dia da semana são especificados (não *), a tarefa é executada quando qualquer condição é atendida (lógica OU, não E). Esta é uma fonte comum de confusão.
Por exemplo, 0 0 13 * 5 executa à meia-noite no dia 13 de cada mês OU toda sexta-feira, não apenas na sexta-feira 13.
Para agendar algo especificamente para sexta-feira 13, você precisaria usar um script que verifica ambas as condições:
0 0 13 * * [ $(date +\%u) -eq 5 ] && /path/to/script.sh
Usando Valores de Passo com Intervalos
Você pode combinar intervalos e valores de passo para controle preciso. A sintaxe início-fim/passo executa em intervalos dentro de um intervalo específico.
Exemplos:
0-30/5 * * * *- A cada 5 minutos durante a primeira metade de cada hora (:00, :05, :10, :15, :20, :25, :30)0 9-17/2 * * *- A cada 2 horas das 9h às 17h (9h, 11h, 13h, 15h, 17h)0 0 1-7 * 1- Primeira segunda-feira de cada mês (executa do dia 1 ao 7 se for segunda-feira)