Utilia

Gerador de expressões cron

Cria uma expressão cron campo a campo, lê-a em linguagem simples, vê as próximas execuções em qualquer fuso horário e converte-a para systemd, Quartz ou AWS.

Construtor

CampoModoValor
Minuto0–59
Hora0–23
Dia do mês1–31, L
Mês1–12 ou JAN–DEC
Dia da semana0–7 (0 e 7 = domingo) ou SUN–SAT

Como criar uma expressão cron

  1. Escreve ou cola uma expressão em Expressão cron, ou escolhe uma nas Predefinições. Macros como @daily ou @weekly também são aceites.
  2. Ou usa o Construtor: para cada campo, escolhe um Modo (Todos, A cada N, Valores específicos, Intervalo ou Personalizado) e preenche o Valor. A expressão atualiza-se à medida que avanças, e editar a expressão atualiza o construtor.
  3. Marca Adicionar um campo de segundos (6 campos) se o teu agendador suportar segundos.
  4. Lê o horário Em linguagem simples (a descrição aparece em português) e verifica depois a lista Próximas execuções. Escolhe o Fuso horário do servidor que corre a tarefa e Quantas execuções queres listar.
  5. Copia a expressão com Copiar ou usa um dos Outros formatos.

Os erros são explicados campo a campo, por exemplo «Minuto: 61 está fora do intervalo (0–59)», para saberes exatamente o que corrigir.

Os cinco campos do cron

Uma linha de cron padrão (Vixie) tem cinco campos, seguidos do comando:

Campo Valores permitidos
Minuto 0–59
Hora 0–23
Dia do mês 1–31
Mês 1–12 ou JAN–DEC
Dia da semana 0–7 (0 e 7 são domingo) ou SUN–SAT

Cada campo aceita * (todos os valores), uma lista 1,15, um intervalo 9-17, um passo */15 (a cada 15 unidades) ou um intervalo com passo 0-30/10. Assim, */15 9-17 * * 1-5 significa a cada 15 minutos das 9:00 às 17:45, de segunda a sexta.

Há uma regra que surpreende muita gente: quando o Dia do mês e o Dia da semana estão ambos restringidos, o cron clássico corre quando qualquer um deles corresponde. 0 0 13 * 5 corre em todos os dias 13 e em todas as sextas-feiras, não só nas sextas-feiras 13. Nesse caso, a ferramenta mostra um aviso.

Próximas execuções e fusos horários

O cron usa o relógio da máquina, ou a definição CRON_TZ/TZ do crontab. A lista Próximas execuções é calculada para o fuso horário que escolheres, incluindo as mudanças da hora de verão: na mudança da primavera, uma tarefa marcada para as 2:30 pode ser saltada, e no outono pode correr uma ou duas vezes, conforme a implementação. Para tarefas que têm de correr exatamente uma vez, prefere horas fora do intervalo 1:00–3:00 ou usa UTC.

Vixie cron, temporizadores systemd, Quartz e AWS

  • Os temporizadores systemd usam OnCalendar= com outra sintaxe: Mon..Fri *-*-* 09..17:00/15:00. As condições de dia da semana e de data são combinadas com E, não com OU, por isso algumas expressões cron não têm equivalente exato.
  • O Quartz e o Spring põem um campo de segundos no início e podem acrescentar um campo de ano. Um dos dois campos de dia tem de ser ?, e o Quartz numera os dias da semana de 1 a 7 a partir de domingo, ao contrário do 0–6 do cron. A ferramenta escreve os dias da semana pelo nome (MON-FRI) para evitar essa armadilha.
  • O AWS EventBridge usa cron(minutos horas dia mês dia-da-semana ano): seis campos, sem segundos, um ? num dos campos de dia e o ano no fim.

O cron padrão não tem campo de segundos. A forma com 6 campos e segundos é suportada por muitas bibliotecas (node-cron, Spring, Quartz), mas não pelo crontab do sistema.

Perguntas frequentes

Como corro uma tarefa a cada 5 minutos?

Usa */5 * * * *. A tarefa corre aos minutos 0, 5, 10… de todas as horas.

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

Muitos agendadores aceitam L no campo do dia do mês: 0 18 L * *. Com o Vixie cron simples, corre a tarefa todos os dias de 28 a 31 e verifica no script se amanhã é dia 1.

O que faz o @reboot?

Corre o comando uma vez, quando o daemon do cron arranca. Não tem horário, por isso a ferramenta não consegue listar execuções.

Porque é que a minha tarefa não corre à hora indicada?

Verifica o fuso horário do servidor, o crontab do utilizador versus o /etc/crontab (que tem um campo extra para o utilizador) e o PATH: o cron arranca com um ambiente mínimo.

O domingo é 0 ou 7?

Ambos. No campo do dia da semana, 0 e 7 significam domingo, 1 é segunda-feira e 6 é sábado.