Pular para o conteúdo principal

Testar expressão cron

O Interpretador de expressões cron explica um agendamento em linguagem clara e lista as próximas dez execuções dele, no seu navegador. Ele enuncia a regra que pega quase todo mundo: quando dia do mês e dia da semana estão ambos restritos, o cron aplica um OU entre os dois — então 0 0 13 * 5 dispara no dia 13 ou em qualquer sexta-feira, e não é sexta-feira 13.

Só local
Digite uma expressão cron acima ou clique em Carregar exemplo para ver um agendamento de exemplo e as próximas execuções.

Como funciona o Testar expressão cron?

O cron são cinco números e, ainda assim, é sistematicamente mal interpretado. Três coisas explicam quase tudo isso.

Os dois campos de dia recebem um OU, e não um E

Todo outro par de campos tem interseção: 0 9 * 6 * é nove horas em junho, hora e mês. Os campos de dia, não. Quando dia do mês e dia da semana estão ambos restritos, a tarefa roda se qualquer um deles casar. Então 0 0 13 * 5 dispara no dia 13 de todo mês e em toda sexta-feira — cerca de cinco vezes por mês, não uma ou duas por ano. Isso está no POSIX e na página de manual do Vixie cron e ainda surpreende as pessoas, e é por isso que a explicação aqui o diz explicitamente em vez de descrever os campos separadamente.

Quando um dos dois é *, o outro decide sozinho, e é por isso que 0 0 * * 5 é, sem mistério, toda sexta-feira.

O cálculo da próxima execução é uma busca que precisa terminar

0 0 31 2 * pede meia-noite em 31 de fevereiro, o que nunca acontece. Uma varredura minuto a minuto leva 2.6 milhões de iterações para atingir um limite de um ano e desistir; uma varredura sem limite nunca desiste de todo. A busca aqui salta pela maior unidade que consegue eliminar — um mês que não casa avança para o dia 1 do mês seguinte, e não percorre os dias dele — então um agendamento impossível é provado impossível em algumas centenas de passos.

Tudo aqui é UTC, de propósito

Uma tarefa agendada em um fuso com horário de verão roda de verdade duas vezes em uma noite do ano e nenhuma em outra: quando o relógio volta, 01:30 acontece duas vezes; quando adianta, 02:30 não acontece. Implementações de cron diferentes lidam com isso de formas diferentes, e algumas não lidam de jeito nenhum. Calcular em UTC e dizer isso é honesto; aplicar silenciosamente o fuso do seu navegador produziria horários com cara de confiáveis e errados duas vezes por ano.

Quantidade de campos e dialetos

Cinco campos é o cron padrão do Unix. Seis geralmente significa segundos primeiro, que é o que Quartz, Spring e node-cron fazem — embora alguns agendadores coloquem um ano por último, o que é genuinamente ambíguo e aqui é resolvido a favor dos segundos. Sete campos é Quartz com os dois. O interpretador aceita nomes de meses e de dias, faixas circulares como FRI-MON e 22-2, ? como curinga, tanto 0 quanto 7 para domingo, e a família de abreviações @daily.

@reboot é reconhecido e explicado, em vez de interpretado: ele não tem agendamento, então não há próxima execução a calcular.

Expressão

0 0 13 * 5

Explicação

At 00:00, on day 13 of the month OR on Friday
— cron ORs these two fields rather than
intersecting them, so this is not
"Friday the 13th". UTC.

Quais opções e casos-limite o Testar expressão cron suporta?

Referência técnica e opções
ParâmetroTipoPadrãoComportamento e casos-limite
*curingatodos os valoresNo campo dia, também significa 'deixar o outro campo dia decidir', o que torna a regra OR gerenciável.
*/npasso—Todo enésimo valor a partir do mínimo do campo. */15 em minutos é 0, 15, 30, 45 — não 'a cada 15 minutos a partir de agora'.
a-bintervalo—Inclusivo. Intervalos contínuos são aceitos: 22-2 em horas é 22, 23, 0, 1, 2, e FRI-MON é o fim de semana.
a,b,clista—Qualquer combinação de valores únicos, intervalos e passos, separados por vírgula.
n/mpasso a partir de n—5/6 em horas é 5, 11, 17, 23 — de 5 até o máximo, em passos de 6.
NomesJAN-DEC, SUN-SATaceitoNão diferencia maiúsculas de minúsculas e pode ser usado em intervalos: JAN-MAR, MON-FRI.
0 e 7DomingoambosTodas as implementações aceitam ambos, e quase nenhuma documentação menciona isso no mesmo lugar que qualquer outra coisa.
?curingaQuartzTratado como *. Quartz usa para significar 'nenhum valor específico' em um campo dia.
Número de campos5, 6 ou 75Cinco é o padrão Unix. Seis é lido como segundos primeiro, que é o que Quartz, Spring e node-cron significam. Sete é Quartz com ano.
@daily e similaresabreviaçãoexpandido@yearly @annually @monthly @weekly @daily @midnight @hourly. @reboot não tem agendamento e é explicado em vez de ser analisado.
Fuso horárioUTCsempreUm agendamento de hora local realmente executa duas vezes em uma noite por ano e não executa em outra. Computar em UTC e informar isso é melhor do que produzir horas locais com confiança errada.

Perguntas frequentes

0 0 13 * 5 roda na sexta-feira 13?

Não — ele roda no dia 13 de todo mês e em toda sexta-feira. O cron aplica um OU aos dois campos de dia em vez de cruzá-los, o que é o oposto do que todo outro par de campos faz e o mal-entendido de cron mais comum que existe. Para a sexta-feira 13 especificamente, você precisa de uma restrição de dia do mês mais uma verificação dentro da própria tarefa; o cron não consegue expressar a interseção.

O que */15 significa de verdade?

Todo valor divisível por 15 dentro do campo, começando do mínimo do campo — então em minutos é 0, 15, 30 e 45. Não é 'a cada quinze minutos a partir de quando eu fiz o deploy'. A distinção importa quando você combina isso com uma restrição de hora: 0 */2 * * * roda às 00:00, 02:00, 04:00 e assim por diante, e não duas horas após cada execução anterior.

Por que todos os horários estão em UTC?

Porque um agendamento em hora local é genuinamente ambíguo duas vezes por ano. Quando o relógio volta, 01:30 ocorre duas vezes e algumas implementações rodam a tarefa duas vezes; quando adianta, 02:30 não ocorre e algumas implementações a pulam completamente. O comportamento varia entre implementações de cron. Mostrar UTC e dizer isso é honesto; aplicar silenciosamente o fuso do seu navegador produziria horários com cara de confiáveis, errados por dois dias por ano.

Cinco, seis ou sete campos?

Cinco para o cron do Unix, crontab e a maioria dos agendadores de CI. Seis para Quartz, @Scheduled do Spring e node-cron, em que o campo extra vem primeiro e é segundos. Sete para Quartz com um ano no fim. Seis campos é genuinamente ambíguo — alguns agendadores colocam o ano por último — e este interpretador lê com os segundos primeiro, que é de longe o caso mais comum.

Por que minha expressão não mostra nenhuma execução?

Ela nunca dispara. A causa usual é uma combinação de dia do mês e mês que não existe — 0 0 31 2 * pede 31 de fevereiro — ou uma restrição de ano já no passado. A busca olha cinco anos à frente antes de concluir isso, então uma lista vazia significa genuinamente impossível, e não apenas distante.

Minha expressão é enviada?

Não. A interpretação e a busca da próxima execução rodam no seu navegador. Uma expressão cron não é um segredo, mas descreve o ritmo da sua infraestrutura, e não há motivo para isso chegar a um servidor que não tem uso para ela.

O que mais o Testar expressão cron pode fazer?