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

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

Agendamentos Diários

Agendamentos Semanais

Agendamentos Mensais e Anuais

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: