Referência conferida no crontab(5) e na documentação de cada plataforma
Exemplos de expressões cron
Uma expressão cron tem cinco campos separados por espaço: minuto, hora, dia do mês, mês e dia da semana. */5 * * * * roda a cada 5 minutos, 0 0 * * * todo dia à meia-noite, e 0 9 * * 1-5 às 09:00 em dias úteis.
Cada página abaixo explica um agendamento campo a campo, mostra as próximas execuções no seu fuso e em UTC, e traz o mesmo agendamento para crontab, GitHub Actions, Kubernetes, Vercel, Cloudflare Workers, node-cron, systemd e Spring/Quartz, com as armadilhas específicas de cada caso.
Todos os agendamentos
Segundos e minutos
| Agendamento | Expressão | Roda |
|---|---|---|
| Cron a cada 30 segundos | */30 * * * * * | Duas vezes por minuto (impossível no cron de 5 campos) |
| Cron a cada minuto | * * * * * | No início de cada minuto |
| Cron a cada 5 minutos | */5 * * * * | Nos minutos 0, 5, 10, …, 55 de toda hora |
| Cron a cada 10 minutos | */10 * * * * | Nos minutos 0, 10, 20, 30, 40 e 50 |
| Cron a cada 15 minutos | */15 * * * * | Em :00, :15, :30 e :45 de toda hora |
| Cron a cada 30 minutos | */30 * * * * | Nos minutos 0 e 30 de toda hora |
Horas
| Agendamento | Expressão | Roda |
|---|---|---|
| Cron a cada hora | 0 * * * * | No minuto 0 de toda hora |
| Cron a cada 2 horas | 0 */2 * * * | No minuto 0 de toda hora par |
| Cron a cada 6 horas | 0 */6 * * * | Às 00:00, 06:00, 12:00 e 18:00 |
| Cron a cada 12 horas | 0 */12 * * * | Às 00:00 e às 12:00 |
| Cron duas vezes por dia | 0 9,21 * * * | Às 09:00 e às 21:00 |
Dias
| Agendamento | Expressão | Roda |
|---|---|---|
| Cron todo dia à meia-noite | 0 0 * * * | Uma vez por dia, às 00:00 |
| Cron todo dia ao meio-dia | 0 12 * * * | Uma vez por dia, às 12:00 |
| Cron todo dia às 9h | 0 9 * * * | Uma vez por dia, às 09:00 |
| Cron a cada 3 dias | 0 0 */3 * * | Dias 1, 4, 7, …, 31 de cada mês, às 00:00 |
Dias da semana e semanas
| Agendamento | Expressão | Roda |
|---|---|---|
| Cron todo dia útil | 0 0 * * 1-5 | Às 00:00, de segunda a sexta |
| Cron todo dia útil às 9h | 0 9 * * 1-5 | Às 09:00, de segunda a sexta |
| Cron todo fim de semana | 0 0 * * 0,6 | Às 00:00 de sábado e de domingo |
| Cron toda segunda-feira | 0 0 * * 1 | Às 00:00 de toda segunda-feira |
| Cron todo domingo | 0 0 * * 0 | Às 00:00 de todo domingo |
| Cron toda semana | 0 0 * * 0 | Uma vez por semana, domingo às 00:00 |
Meses, trimestres e anos
| Agendamento | Expressão | Roda |
|---|---|---|
| Cron todo mês | 0 0 1 * * | Uma vez por mês, dia 1 às 00:00 |
| Cron no primeiro dia do mês | 0 0 1 * * | Dia 1 de todo mês às 00:00 |
| Cron no último dia do mês | 0 0 L * * | Último dia de cada mês (exige L ou teste de data) |
| Cron todo trimestre | 0 0 1 1,4,7,10 * | 1º de jan, abr, jul e out às 00:00 |
| Cron todo ano | 0 0 1 1 * | Uma vez por ano, 1º de janeiro às 00:00 |
Especiais
| Agendamento | Expressão | Roda |
|---|---|---|
| Cron @reboot: rodar uma tarefa na inicialização | @reboot | Uma vez quando o daemon do cron inicia após o boot |
Guia rápido da sintaxe do cron
Os cinco campos
| # | Campo | Valores aceitos | 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-6, domingo = 0 (7 também é domingo no cronie, Debian, node-cron, Spring) | SUN-SAT |
Caracteres especiais
| Caractere | Significado | Exemplo |
|---|---|---|
* | Todos os valores do campo | * * * * * a cada minuto |
, | Lista de valores | 0 9,17 * * * às 09:00 e às 17:00 |
- | Faixa inclusiva | 0 9 * * 1-5 de segunda a sexta |
/ | Passo, dentro do campo | */15 * * * * minutos 0, 15, 30, 45 |
a-b/n | Passo dentro de uma faixa | 0 1-23/2 * * * horas ímpares |
L (último), W (dia útil mais próximo), # (enésimo dia da semana) e ? (sem valor) são extensões do Quartz. Spring, node-cron e Cloudflare aceitam a maioria; crontab, GitHub Actions, Kubernetes e Vercel não.
Macros
| Macro | Equivale a | Roda |
|---|---|---|
@yearly, @annually | 0 0 1 1 * | 1º de janeiro às 00:00 |
@monthly | 0 0 1 * * | Dia 1 de cada mês às 00:00 |
@weekly | 0 0 * * 0 | Domingo às 00:00 |
@daily, @midnight | 0 0 * * * | Todo dia às 00:00 |
@hourly | 0 * * * * | Minuto 0 de toda hora |
@reboot | (sem horário) | Uma vez quando o daemon do cron inicia |
Como o cron decide quando rodar
Ele verifica a cada minuto
O daemon acorda uma vez por minuto e dispara toda tarefa cujos campos de minuto, hora e mês batem com o horário atual e cujos campos de dia batem com hoje. Ele não guarda histórico: um minuto perdido está perdido, e é por isso que existem o anacron e o Persistent=true do systemd.
Passos recomeçam em cada campo
Um passo como */7 só se repete dentro do próprio campo. Os minutos vão 0, 7, …, 56 e voltam ao 0, então o intervalo na virada da hora é de 4 minutos. O mesmo vale para horas (*/5) e dias (*/3 recomeça no dia 1). Só passos que dividem o campo por igual dão um intervalo constante.
Dia do mês OU dia da semana
Pelo crontab(5), se os dois campos de dia estão restritos, a tarefa roda quando qualquer um bate. 30 4 1,15 * 5 roda no dia 1, no dia 15 e em toda sexta. Um campo que começa com * conta como irrestrito no cronie, até */2. node-cron e systemd usam E, a Vercel recusa os dois juntos e o Quartz obriga um ? em um deles.
Fuso horário e horário de verão
O crontab segue o fuso do servidor; o cronie também lê CRON_TZ. Agendadores hospedados usam UTC na maioria. O Brasil não tem horário de verão desde 2019, mas em fusos que têm, tarefas entre 01:00 e 03:00 no horário local são as que acabam puladas ou repetidas; evite essa janela ou agende em UTC.
Diferenças entre plataformas
Os mesmos cinco campos se comportam de forma um pouco diferente dependendo de onde rodam. Conferido na documentação de cada fornecedor na data de revisão abaixo.
| Plataforma | Fuso horário | Menor intervalo | Segundos | Dias da semana e extensões |
|---|---|---|---|---|
| crontab (cronie, Debian) | Do servidor, ou CRON_TZ (cronie) | 1 minuto | Não | 0-7, nomes; macros; sem L |
| GitHub Actions | UTC, ou timezone | 5 minutos, pode atrasar | Não | 0-6, nomes; sem macros |
| Kubernetes CronJob | spec.timeZone, senão o do controlador | 1 minuto | Não | 0-6, nomes; macros; ? = * |
| Vercel | Só UTC | 1 minuto (Pro), 1 dia (Hobby) | Não | 0-6; sem nomes; não aceita os dois campos de dia |
| Cloudflare Workers | Só UTC | 1 minuto | Não | 1 = domingo … 7 = sábado; L, W, # |
| node-cron 4.x | Do processo, ou opção timezone | 1 segundo | 1º campo opcional | 0-7, nomes; L, W, #; campos de dia com E |
| Timer do systemd | Do sistema, ou fuso no fim | Menos de 1 segundo (ajuste AccuracySec) | Sim | Sintaxe própria: Mon..Fri *-*-* 09:00 |
Spring @Scheduled | Da JVM, ou zone | 1 segundo | 1º campo obrigatório | 0-7, nomes; L, W, #; macros |
| Quartz | Da JVM, ou do trigger | 1 segundo | 1º campo obrigatório | 1 = domingo … 7 = sábado; ? obrigatório |
Ferramentas
Para montar uma expressão escolhendo opções, ou colar uma e ler em linguagem comum:
Perguntas frequentes
- Quais são os cinco campos de uma expressão cron?
- Minuto (0-59), hora (0-23), dia do mês (1-31), mês (1-12) e dia da semana (0-6, domingo = 0, e 7 também é domingo na maioria dos crons). Uma linha do crontab acrescenta o comando depois deles.
- Qual fuso horário o cron usa?
- O crontab usa o fuso local do servidor (o cronie também lê CRON_TZ). O GitHub Actions usa UTC a menos que você defina timezone, o Kubernetes usa spec.timeZone ou o fuso do controlador, e Vercel e Cloudflare sempre usam UTC.
- O que acontece quando dia do mês e dia da semana estão preenchidos?
- No cron padrão a tarefa roda quando qualquer um deles bate: 0 0 1 * 1 roda no dia 1 e em toda segunda. node-cron e systemd usam E, a Vercel proíbe preencher os dois e o Quartz exige ? em um deles.
- O cron roda tarefas a cada poucos segundos?
- Não. O cron de cinco campos tem resolução de um minuto. Use duas linhas com sleep, um timer do systemd ou um agendador de 6 campos como node-cron ou Spring para intervalos menores que um minuto.
- Como conferir uma expressão cron antes do deploy?
- Olhe as próximas execuções. Cada página aqui lista essas datas, a ferramenta cron para texto deste site explica qualquer expressão, e no Linux o systemd-analyze calendar faz o mesmo para valores de OnCalendar.
Revisado em por Arielton Oberek.