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.
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?
| Parâmetro | Tipo | Padrão | Comportamento e casos-limite |
|---|---|---|---|
| * | curinga | todos os valores | No campo dia, também significa 'deixar o outro campo dia decidir', o que torna a regra OR gerenciável. |
| */n | passo | — | 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-b | intervalo | — | 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,c | lista | — | Qualquer combinação de valores únicos, intervalos e passos, separados por vírgula. |
| n/m | passo a partir de n | — | 5/6 em horas é 5, 11, 17, 23 — de 5 até o máximo, em passos de 6. |
| Nomes | JAN-DEC, SUN-SAT | aceito | Não diferencia maiúsculas de minúsculas e pode ser usado em intervalos: JAN-MAR, MON-FRI. |
| 0 e 7 | Domingo | ambos | Todas as implementações aceitam ambos, e quase nenhuma documentação menciona isso no mesmo lugar que qualquer outra coisa. |
| ? | curinga | Quartz | Tratado como *. Quartz usa para significar 'nenhum valor específico' em um campo dia. |
| Número de campos | 5, 6 ou 7 | 5 | Cinco é o padrão Unix. Seis é lido como segundos primeiro, que é o que Quartz, Spring e node-cron significam. Sete é Quartz com ano. |
| @daily e similares | abreviação | expandido | @yearly @annually @monthly @weekly @daily @midnight @hourly. @reboot não tem agendamento e é explicado em vez de ser analisado. |
| Fuso horário | UTC | sempre | Um 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.