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 | jan–dec |
| 5 | Dia da semana | 0–7 (0 e 7 são domingo) | sun–sat |
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.
- Quartz (Java) usa seis ou sete campos: segundos, minutos, horas, dia do mês, mês, dia da semana e um ano opcional. Um dos dois campos de dia precisa ser
?("nenhum valor específico"). O Quartz também aceitaL(último),W(dia útil mais próximo) e#(enésimo dia da semana do mês):0 15 10 L * ?roda às 10:15 no último dia de cada mês, e0 15 10 ? * 6#3roda às 10:15 na terceira sexta-feira, porque o Quartz numera os dias da semana de 1 a 7 começando pelo domingo. - As expressões do Spring em
@Scheduled(cron = "…")têm seis campos: primeiro os segundos, depois os cinco de sempre, sem ano. - As regras do AWS EventBridge usam
cron(minutes hours day-of-month month day-of-week year): seis campos, sem segundos, um ano no fim e um?em um dos dois campos de dia.cron(0 12 * * ? *)roda todos os dias às 12:00 UTC. As regras de um barramento de eventos funcionam em UTC, enquanto o EventBridge Scheduler permite escolher um fuso horário. Assim como o Quartz, a AWS numera os dias da semana de 1 a 7, com 1 = domingo. - Os CronJobs do Kubernetes usam os cinco campos padrão em
spec.schedule. Semspec.timeZone, o agendamento segue o fuso horário do kube-controller-manager. Defina um nome IANA comoEurope/Berlinpara fixá-lo. - Os gatilhos
scheduledo GitHub Actions usam cinco campos e são executados em UTC, a menos que indique um fuso horário IANA opcional. O intervalo mais curto aceito é de cinco minutos, macros como@dailynão são aceitas, e as execuções agendadas podem atrasar quando o GitHub está sobrecarregado, sobretudo no início de cada hora.
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:
- 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.
- Teste o comando com um agendamento curto. Use
* * * * *temporariamente para que a tarefa rode em até um minuto e depois troque pelo agendamento real. - Guarde a saída. Acrescente
>> /tmp/myjob.log 2>&1depois do comando para que os erros sejam gravados em um arquivo em vez de se perderem. - Verifique o log do cron. Use
grep CRON /var/log/syslogoujournalctl -u cronno Debian e no Ubuntu, ejournalctl -u crondno Fedora e no RHEL. - Use caminhos absolutos. O cron inicia as tarefas com um ambiente mínimo e um
PATHcurto, 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:
- valida a sintaxe e avisa quando uma expressão é inválida;
- descreve o agendamento em palavras simples (em inglês);
- aceita os cinco campos padrão, um campo opcional de segundos no início, nomes de meses e dias da semana, e 7 para domingo;
- converte macros como
@weeklyno equivalente de cinco campos e explica o que@rebootfaz; - mostra uma tabela de referência com cada símbolo e um exemplo.
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.