Calcular as próximas execuções de uma expressão cron
- Painel
- Documentação
- API
O que é uma expressão cron?
Uma expressão cron é uma cadeia curta que descreve uma recorrência no tempo. O
formato herdado de Unix cabe em cinco campos separados por espaços: minuto, hora,
dia do mês, mês e dia da semana. Esta sintaxe nasceu com o demónio
cron de Brian Kernighan nos anos 1970, depois generalizado pelo Vixie cron
(1987) retomado por todas as distribuições Linux e macOS modernas. Atualmente, a mesma sintaxe
encontra-se na maioria dos agendadores cloud (AWS EventBridge, GCP Cloud Scheduler, Azure Logic
Apps) e CI/CD (GitHub Actions, GitLab CI, Jenkins).
┌──── minute (0-59)
│ ┌── heure (0-23)
│ │ ┌── jour du mois (1-31)
│ │ │ ┌── mois (1-12 ou JAN-DEC)
│ │ │ │ ┌── jour de la semaine (0-7 ou SUN-SAT, 0 et 7 = dimanche)
│ │ │ │ │
* * * * *
Uma expressão cron bem formada define portanto um cron schedule preciso: cada campo pode ser um valor fixo, um intervalo, uma lista, um passo ou um asterisco que corresponde a tudo. A compacidade da expressão crontab é a sua força, mas é também o que torna um cron decoder indispensável para validar visualmente a intenção. É todo o objeto deste cron converter: produzir uma explicação cron legível e a lista das próximas execuções.
Anatomia de uma expressão cron
Os cinco campos partilham uma gramática comum. Eis os limites aceites por cada coluna de uma expressão crontab padrão:
- Minuto:
0-59. - Hora:
0-23, formato 24h. - Dia do mês:
1-31. - Mês:
1-12ou as abreviaturas textuaisJAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC. - Dia da semana:
0-7em que0e7representam ambos domingo, ou as abreviaturasSUN,MON,TUE,WED,THU,FRI,SAT.
Caracteres especiais partilhados pelos cinco campos:
*: any value, corresponde a todos os valores permitidos do campo.,: lista discreta, por exemplo1,15,30no campo minuto.-: intervalo inclusivo, por exemplo9-17para o horário de escritório./: passo (step), por exemplo*/15= a cada 15 unidades, ou0-30/5= a cada 5 minutos entre 0 e 30.
Extensões Quartz (Java, AWS EventBridge, Spring): a gramática sobe para 6 ou 7
campos com uma coluna segundos no início (0-59) e por vezes uma coluna
ano no fim (1970-2099). O Quartz introduz também ? (no specific
value, para desacoplar dia-do-mês e dia-da-semana), L (last: último dia do mês,
ou última sexta com 5L), W (dia útil mais próximo) e #
(N-ésimo dia da semana do mês, por exemplo 2#3 para a 3ª segunda-feira). Uma expressão
Quartz não é, em geral, compatível com um crontab UNIX, e vice-versa: é a principal
fonte de erro quando se copia uma expressão cron de uma plataforma para outra.
# UNIX / Vixie cron (5 champs)
0 9 * * 1-5
# Quartz (6 champs avec secondes)
0 0 9 ? * MON-FRI
# Quartz (7 champs avec année)
0 0 9 ? * MON-FRI 2026
Porquê descodificar uma expressão cron?
Ler 0 0 * * * é rápido. Ler */7 2-5 1,15 * 1-5 já não é. Quando
uma expressão sai do trivial, o risco de erro de interpretação aumenta e a descodificação cron
torna-se uma etapa de revisão por direito próprio.
- Debug em produção: perceber porque é que uma tarefa disparou às 03h17 e não às 03h00, ou identificar uma sobreposição entre dois jobs.
- Code review: validar que um agendador colocado em pull request faz mesmo o que o autor afirma, sem ter de memorizar a semântica de cada símbolo.
- Auditoria de agendadores: passar em revista os cron jobs Linux em
/etc/crontabe/etc/cron.d/, os triggers do Jenkins, osspec.scheduledos Kubernetes CronJob, as regras AWS EventBridge e os jobs GCP Cloud Scheduler. - Migração legacy: pegar num
/etc/crontabhistórico sem documentação e reconstruir o mapeamento das tarefas antes de uma mudança de infraestrutura. - Onboarding: permitir que um novo programador releia uma crontab sem ter de aprender todos os caracteres especiais de um dia para o outro.
Como utilizar o cron decoder
Os passos para descodificar uma expressão crontab com a ferramenta:
- Cole a sua expressão cron no campo de entrada (5 campos separados por espaços).
- Indique o número de próximas execuções a calcular.
- Clique em convert para iniciar a descodificação cron: a ferramenta devolve uma frase humana que explica o disparo, mais a lista datada das próximas execuções.
- Verifique visualmente que as datas correspondem à sua intenção (hora, dia, frequência).
- Copie a saída com o botão de cópia para a colar num ticket, num PR ou numa documentação técnica.
A ferramenta não se limita a um parsing sintático: fornece uma explicação cron em linguagem natural, o que a torna ao mesmo tempo um cron decoder e um validador de planeamento.
Exemplos clássicos de expressão cron
Os padrões abaixo cobrem o essencial dos cron schedules encontrados em produção. Todos são válidos em Linux crontab, Kubernetes CronJob, GitHub Actions e na maioria dos agendadores aplicacionais.
| Expressão | Leitura humana |
|---|---|
* * * * * |
A cada minuto |
0 * * * * |
A cada hora certa |
0 0 * * * |
Todos os dias à meia-noite |
0 0 * * 0 |
Todos os domingos à meia-noite |
*/15 * * * * |
A cada 15 minutos |
0 9 * * 1-5 |
9h00 de segunda a sexta |
0 0 1 * * |
No dia 1 de cada mês à meia-noite |
0 0,12 * * * |
À meia-noite e ao meio-dia todos os dias |
*/5 9-17 * * 1-5 |
A cada 5 minutos em horário laboral |
30 2 1,15 * * |
No dia 1 e no dia 15 do mês às 2h30 |
Para executar uma tarefa cron num servidor Linux, edita-se a crontab do utilizador a partir da shell:
# éditer la crontab de l'utilisateur courant
$ crontab -e
# lister les tâches existantes
$ crontab -l
# exemple de ligne ajoutée : sauvegarde quotidienne à 3h
0 3 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1
Exemplo de saída do cron converter para */5 * * * *:
2026-05-05 00:00:00
2026-05-05 00:05:00
2026-05-05 00:10:00
2026-05-05 00:15:00
2026-05-05 00:20:00
...
Perguntas frequentes sobre o cron decoder
Qual a diferença entre cron UNIX e Quartz?
UNIX/Vixie cron utiliza 5 campos (minuto a dia-da-semana), sem precisão ao segundo, e não tem
noção nativa de "último dia do mês". O Quartz (Java, Spring, AWS EventBridge) acrescenta uma coluna
segundos no início, por vezes uma coluna ano no fim, e vários símbolos
(?, L, W, #) ausentes do crontab Linux. Uma
expressão cron Quartz com 6 campos não é, portanto, diretamente portável para
/etc/crontab, e inversamente. O nosso cron decoder visa o formato de 5
campos, que cobre a maioria dos agendadores.
Como executar uma tarefa cron a cada 5 minutos?
Com o passo / no campo minuto:
*/5 * * * * /usr/local/bin/check-health.sh
Esta expressão crontab dispara o script aos minutos 0, 5, 10, 15... de cada
hora, todos os dias. Para limitar ao horário laboral de segunda a sexta, adicione as restrições
nos campos hora e dia-da-semana: */5 9-17 * * 1-5.
O que significa o asterisco (*) numa expressão cron?
O asterisco significa any value: corresponde a todos os valores permitidos do campo. Em
0 0 * * *, as três estrelas significam "qualquer dia do mês, qualquer
mês, qualquer dia da semana". Combinado com os dois primeiros campos fixados em 0,
obtém-se "todos os dias à meia-noite". A estrela também se pode combinar com um passo: */15 em
minuto = a cada 15 minutos.
A crontab tem um fuso horário?
Por defeito, o fuso do servidor. Num crontab Linux, é a TZ do sistema (muitas vezes UTC em VPS e
contentores). O GitHub Actions força UTC. O Kubernetes CronJob utiliza o fuso do controlador,
configurável através de spec.timeZone desde a 1.27. O AWS EventBridge avalia as expressões em
UTC. Os agendadores aplicacionais (Symfony Scheduler, Quartz, Airflow) permitem frequentemente fixar um
fuso dedicado a cada tarefa. Em caso de dúvida, verifique date no servidor alvo e
compare com a saída do cron converter.
Cron job vs comando at: qual escolher?
cron serve para executar uma tarefa recorrente segundo um planeamento. at serve
para executar um comando uma única vez num instante dado. Para um backup diário,
uma rotação de logs ou uma chamada de API regular, utilize cron. Para diferir uma operação única
("relança este deploy às 22h esta noite"), utilize at:
$ echo "/usr/local/bin/deploy.sh" | at 22:00
Como testar uma expressão cron sem a disparar?
É precisamente o papel deste cron converter: calcula as N próximas
execuções a partir do instante atual, sem arrancar nenhum job. Vê imediatamente se a sua
expressão crontab dispara às 03h00 como previsto ou às 03h17 por acidente. Para ir mais
longe antes de instalar a tarefa, também pode testar o script sozinho (bash -x script.sh)
e verificar a sintaxe de um ficheiro crontab com crontab -T ficheiro nas distribuições
que o suportam.
O que acontece se dia-do-mês e dia-da-semana estiverem ambos definidos?
Em Vixie cron (Linux), a regra é um OU lógico: o job dispara se um ou
outro dos dois campos corresponder. É contraintuitivo e fonte de bugs. O Quartz utiliza um
E, daí a introdução do símbolo ? para sinalizar explicitamente "sem
restrição". Como regra geral, defina apenas um dos dois campos.
Exemplo de pedido
curl -X POST https://cdrn.fr/api/v1/tools/cron-converter/execute \
-H "Content-Type: application/json" \
-d '{"cron":"...","number_next_date":1}'
Esquema de entrada
| Campo | Tipo | Obrigatório | Predefinição |
|---|---|---|---|
cron |
string | ✓ | – |
number_next_date |
integer | ✓ | – |
Pontos de acesso
GET https://cdrn.fr/api/v1/tools- lista todas as ferramentas disponíveisGET https://cdrn.fr/api/v1/tools/cron-converter- obtém o esquema desta ferramentaPOST https://cdrn.fr/api/v1/tools/cron-converter/execute- executa esta ferramenta com um payload JSON