O que é uma expressão cron? Sintaxe, campos e 15 exemplos

Uma expressão cron é uma sequência curta de caracteres que diz a um agendador quando executar uma tarefa. A forma padrão tem cinco campos separados por espaços: minuto, hora, dia do mês, mês e dia da semana. Por exemplo, */15 * * * * significa "a cada 15 minutos": */15 no campo dos minutos corresponde aos minutos 0, 15, 30 e 45, e os quatro asteriscos significam qualquer hora, qualquer dia, qualquer mês e qualquer dia da semana.

Experimente grátis: Gerador de Crontab Gratuito e sem necessidade de conta.

O nome vem do cron, o agendador de tarefas do Unix, mas hoje a mesma sintaxe controla pipelines de CI, agendadores na nuvem e frameworks de aplicações, às vezes com campos extras. Este guia explica a sintaxe, 15 exemplos verificados, as variantes mais comuns e os erros que fazem uma tarefa rodar na hora errada. Para conferir qualquer expressão durante a leitura, cole-a no gerador de Crontab gratuito, que descreve o agendamento em palavras simples.

Os cinco campos de uma expressão cron

Os campos são lidos da esquerda para a direita:

Posição Campo Valores permitidos Nomes
1 Minuto 0–59
2 Hora 0–23
3 Dia do mês 1–31
4 Mês 1–12 jandec
5 Dia da semana 0–7 (0 e 7 são domingo) sunsat

As horas usam o formato de 24 horas, então 14h se escreve 14. Os nomes são as três primeiras letras do mês ou do dia em inglês, e tanto faz usar maiúsculas ou minúsculas. Algumas implementações, entre elas o cron do macOS, não aceitam nomes dentro de intervalos ou listas, por isso 1-5 é mais portável do que mon-fri.

Em um arquivo crontab, o comando vem depois dos cinco campos: 0 2 * * * /home/me/backup.sh. O arquivo /etc/crontab do sistema, no Linux, tem ainda um campo com o nome de usuário antes do comando.

Caracteres especiais: asterisco, vírgula, hífen e barra

Quatro caracteres fazem quase todo o trabalho:

Caractere Significado Exemplo Corresponde a
* Qualquer valor * no campo das horas Horas 0, 1, 2 … 23
, Lista 8,20 no campo das horas Horas 8 e 20
- Intervalo (inclusivo) 1-5 no dia da semana De segunda a sexta
/ Passo */15 no campo dos minutos Minutos 0, 15, 30, 45

Dá para combiná-los. 9-17/2 no campo das horas corresponde a 9, 11, 13, 15 e 17, e 0-4,8-12 é uma lista de dois intervalos.

Os passos recomeçam a cada ciclo. */7 no campo dos minutos corresponde a 0, 7, 14 … 56 e de novo a 0 no início da hora seguinte, então entre :56 e :00 passam quatro minutos, não sete. Um passo que não divide exatamente 60 minutos ou 24 horas nunca gera um intervalo totalmente regular.

15 exemplos de expressões cron

Cada exemplo foi conferido campo por campo. Os horários valem no fuso horário do agendador.

Expressão cron Quando é executada
* * * * * A cada minuto
*/5 * * * * A cada 5 minutos (:00, :05, :10 …)
30 * * * * De hora em hora, aos 30 minutos (00:30, 01:30 …)
0 */2 * * * A cada 2 horas, na hora cheia (00:00, 02:00 … 22:00)
0 2 * * * Todos os dias às 02:00
0 8,20 * * * Duas vezes por dia, às 08:00 e às 20:00
0 9 * * 1-5 De segunda a sexta às 09:00
*/15 9-17 * * 1-5 A cada 15 minutos das 09:00 às 17:45, de segunda a sexta
0 6 * * 0,6 Aos sábados e domingos às 06:00
0 0 * * 0 Todo domingo à meia-noite
0 22 * * 5 Toda sexta-feira às 22:00
0 0 1 * * No dia 1 de cada mês à meia-noite
0 12 15 * * No dia 15 de cada mês às 12:00
0 0 1 1,4,7,10 * A cada trimestre: 1º de janeiro, abril, julho e outubro à meia-noite
0 0 1 1 * Uma vez por ano, 1º de janeiro à meia-noite

Dois detalhes passam despercebidos com facilidade. Primeiro, os intervalos incluem as duas pontas, então 9-17 inclui a hora 17: */15 9-17 * * 1-5 roda 36 vezes por dia e a última execução é às 17:45, não às 17:00. Segundo, 0 0 1 */3 * gera o mesmo agendamento trimestral, porque */3 no campo do mês começa em 1 e corresponde aos meses 1, 4, 7 e 10.

Macros fora do padrão: @daily, @weekly e @reboot

Muitas implementações do cron aceitam uma palavra-chave no lugar dos cinco campos:

Macro Equivale a É executada
@yearly ou @annually 0 0 1 1 * À meia-noite de 1º de janeiro
@monthly 0 0 1 * * À meia-noite do dia 1 de cada mês
@weekly 0 0 * * 0 Domingo à meia-noite
@daily ou @midnight 0 0 * * * Todos os dias à meia-noite
@hourly 0 * * * * No minuto 0 de cada hora
@reboot Uma vez, quando o daemon do cron inicia

Vixie cron, cronie e o cron do macOS aceitam todas, e os CronJobs do Kubernetes aceitam as baseadas em tempo, mas não @reboot. Elas não fazem parte do padrão POSIX, então consulte a documentação antes de usá-las em outros lugares.

Variantes do cron: segundos, anos e caracteres extras

Nem todo agendador lê cinco campos, então confira para qual dialeto você está escrevendo.

A armadilha do dia do mês e do dia da semana

No cron padrão (Vixie), os dois campos de dia são combinados com OU, e não com E, quando ambos estão restritos. Se um deles for *, só o outro conta. Por isso, 0 9 1-7 * 1 não significa "a primeira segunda-feira do mês". A tarefa roda às 09:00 em cada um dos dias de 1 a 7 e também em todas as segundas-feiras, o que dá 10 ou 11 execuções por mês.

Para rodar só na primeira segunda-feira, mantenha um campo de dia na expressão e verifique o outro no comando:

0 9 1-7 * * [ "$(date +\%u)" = 1 ] && /path/to/report.sh

date +%u mostra o dia da semana como um número de 1 a 7, com segunda-feira = 1. O sinal de porcentagem precisa ser escapado como \%, porque o cron transforma um % sem escape no comando em uma quebra de linha. O Quartz e a AWS evitam essa ambiguidade ao exigir ? em um dos dois campos de dia.

Fusos horários e horário de verão

O cron roda no fuso horário da máquina ou do serviço que avalia a expressão, que em servidores e plataformas na nuvem costuma ser UTC, e não o seu horário local. 0 9 * * * em um servidor em UTC roda às 09:00 UTC, ou seja, às 05:00 em Nova York durante o horário de verão (UTC−4). O conversor de fusos horários ajuda a converter um horário local para o fuso do agendador.

O horário de verão cria dois casos especiais nos fusos que o adotam: quando os relógios são adiantados, uma hora local não existe, e quando são atrasados, uma hora acontece duas vezes. O cron do Debian e o cronie compensam pequenas mudanças de relógio nas tarefas com horário fixo: uma execução que cai na hora pulada acontece logo depois da mudança, e uma execução na hora repetida não é repetida. Outros agendadores se comportam de outro jeito, então o mais seguro é manter os servidores em UTC ou deixar as tarefas importantes fora das horas em que os relógios mudam, normalmente entre 01:00 e 03:00 no horário local.

Como testar uma expressão cron

Uma expressão cron errada raramente gera um erro: a tarefa simplesmente roda na hora errada, ou nunca. Uma rotina curta pega a maioria dos problemas:

  1. Leia a expressão em palavras. Cole-a em uma ferramenta que a descreva e confira se a frase corresponde ao que você queria, principalmente nos dois campos de dia.
  2. Teste o comando com um agendamento curto. Use * * * * * temporariamente para que a tarefa rode em até um minuto e depois troque pelo agendamento real.
  3. Guarde a saída. Acrescente >> /tmp/myjob.log 2>&1 depois do comando para que os erros sejam gravados em um arquivo em vez de se perderem.
  4. Verifique o log do cron. Use grep CRON /var/log/syslog ou journalctl -u cron no Debian e no Ubuntu, e journalctl -u crond no Fedora e no RHEL.
  5. Use caminhos absolutos. O cron inicia as tarefas com um ambiente mínimo e um PATH curto, então um comando que funciona no seu terminal pode falhar no cron.

Crie uma expressão com o gerador de Crontab

O gerador de Crontab gratuito roda inteiramente no seu navegador. Digite uma expressão ou clique em uma predefinição rápida como "A cada 15 min", "Diariamente às 2h" ou "Toda segunda-feira", e a ferramenta:

Chaves permitem escolher uma descrição mais detalhada, o formato de 24 horas e se os números dos dias da semana começam em 0 para domingo. Caracteres exclusivos do Quartz (L, W, #) e um campo de ano não são aceitos. A ferramenta apenas cria e confere a expressão; para agendar a tarefa, copie-a para crontab -e ou para a configuração da sua plataforma.

Perguntas frequentes

Qual é a diferença entre cron e crontab?

O cron é o serviço em segundo plano (daemon) que executa as tarefas agendadas. Um crontab, abreviação de "cron table", é o arquivo que as lista, uma tarefa por linha: uma expressão cron seguida de um comando. Você edita o seu próprio crontab com crontab -e e o exibe com crontab -l.

Uma tarefa cron pode rodar a cada 30 segundos?

Não no cron padrão, cuja menor unidade é um minuto. Agendadores com campo de segundos conseguem: o Spring aceita */30 * * * * *, e o Quartz precisa de um ? em um campo de dia, como em */30 * * * * ?. No cron clássico, uma solução comum são duas linhas que rodam a cada minuto, sendo que uma delas executa sleep 30; antes do comando.

Como rodar uma tarefa cron no último dia do mês?

O cron padrão não tem um símbolo para "último dia", mas o Quartz e a AWS aceitam L no campo do dia do mês. No cron clássico, agende os dias 28 a 31 e deixe o comando verificar se amanhã é dia 1:

0 23 28-31 * * [ "$(date -d tomorrow +\%d)" = "01" ] && /path/to/job.sh

date -d tomorrow é sintaxe do GNU date, usado no Linux. No macOS, use date -v+1d.

Experimente grátis: Gerador de Crontab Gratuito e sem necessidade de conta.