A expressão cron mais cara que já escrevi foi 0 0 * * 0. Ele correu um e-mail resumo semanal para um Laravel SaaS Eu estava construindo, e EU estava absolutamente certo de que significava & quot; meia-noite no último dia da semana." Significa domingo meia-noite Meu modelo mental disse que a semana terminou sábado Durante cinco semanas, os clientes tem o seu " semana em review" e-mail um dia atrasado, e ninguém na equipe pegou porque ninguém na equipe poderia ler cron também - todos nós apenas apertou os olhos nos cinco campos e acenou com a cabeça.
Esse é o segredo sujo da sintaxe do Cron: quase todo mundo que escreve é um padrão de uma expressão anterior que lembra pela metade. O formato tem mais de quarenta anos, denso o suficiente para que um único personagem mude completamente o cronograma e ele falhará silenciosamente. Não há erro de compilador para "corre no dia errado." O trabalho é executado apenas no dia errado, para sempre, até que alguém perceba.
um analisador de expressão cron fecha essa lacuna Você cola a expressão, e ela lhe diz em inglês simples o que realmente vai acontecer - 0 0 * * 0 volta como & quot; Às 00:00, no Sunday" - mais quando as próximas execuções irão disparar Esse passo de readback é a diferença entre enviar um cronograma e enviar um palpite Eu construí o em Toolz.dev porque me cansei de mudar de contexto para um terminal, e porque a bagunça wp-cron com a qual lidei por anos no WP Adminify me ensinou que os bugs de agendamento são os bugs mais pacientes em software.
Este guia aborda como usar o analisador, como os cinco campos realmente funcionam (incluindo as duas peculiaridades que causam a maioria dos incidentes de produção) e onde a sintaxe cron difere entre si crontab, ações GitHub, quartzo e Laravel.
tl;dr: Cole qualquer expressão do Crontab no Parser Toolz.dev Cron e obtenha uma tradução simples em inglês mais os próximos tempos de execução - instantaneamente, do lado do cliente, sem inscrição Antes de implantar uma programação, verifique sempre duas coisas: a numeração do dia da semana (0 e 7 são ambos domingo) e o fuso horário em que o agendador é executado (as Ações do GitHub são sempre UTC).Epare-o com o conversor de carimbo de data/hora Quando você precisa traduzir os próximos tempos de execução entre as zonas e o Calculadora de diferença de datas para verificar os intervalos de sanidade.
Principais características
tradução simples
O trabalho principal do analisador está girando */15 9-17 * * 1-5 no & quot; Cada hora 15 da hora passada 9, 10, 11, 12, 13, 14, 15, 16 e 17, na segunda, terça, quarta, quinta e sexta-feira." It' s verbose - enumera em vez de colapsar "9 até 17 & quot; de volta a um intervalo - e essa verbosidade é o ponto A enumeração é inequívoca; um intervalo resumido é outra chance de leitura errada A frase é algo que você pode colar em uma descrição de solicitação pull, ler em voz alta em um stand-up ou mostrar uma parte interessada não técnica A expressão bruta não é Na minha experiência, a tradução é mais importante durante a revisão do código: um revisor que carimbo de borracha cinco campos enigmáticos irá imediatamente pegar " espere, por que a hora 17 aparece quando o trabalho deve parar às 5 PM e quot; quando a tradução é exatamente explicável em que a tradução é escrita em linha bruta.
Próxima execução de pré-
Saber o que uma expressão meios é metade do problema; saber quando Incêndios a seguir é a outra metade O analisador calcula os próximos cinco tempos de execução para que você possa observá-los contra sua intenção É aqui que surgem erros sutis - uma expressão que parece boa em inglês, mas produz uma próxima execução do & quot; em 27 dias e quot; porque você confundiu dia do mês com mês, ou um que dispara às 03:00 desta noite, quando você quis dizer 03:00 após o fim de semana Eu verifico a lista de próxima execução todas as vezes agora, mesmo para expressões I & #39; estou confiante sobre. Especialmente para expressões I & #39; estou confiante sobre - veja a anedota de abertura.
Dois detalhes sobre como esses tempos são calculados. Primeiro, eles são avaliados em O fuso horário local do seu navegador, não UTC e não o seu servidor & #39; s zona - cada execução é mostrada duas vezes, uma vez como um carimbo de data/hora local e uma vez como o equivalente UTC instante, para que você possa ler o que corresponde ao seu alvo de implantação Segundo, quando tanto dia-de-mês e dia-de-semana são restritos, o analisador aplica real cron & #39; s OU semântica em vez de AND: 0 0 1 * 1 Incêndios no primeiro mês e Todas as segundas-feiras, não apenas às segundas-feiras que caem no dia 1º. Essa regra atrapalha pessoas experientes, e ver cinco datas concretas torna óbvio de uma forma que a frase nunca o faz.
Uma aresta: uma expressão impossível como 0 0 30 2 * (30 de Fevereiro) analisa como válido, descreve-se alegremente como & quot; Às 00:00, no dia-do-mês 30, em Fevereiro, o & quot; e depois mostra uma lista vazia de próximas execuções Vazio significa nunca. It' s correto, mas it' s silencioso - a & quot; este cronograma nunca será disparado" aviso é a melhoria óbvia e EU tenho ' t construído ainda.
Repartição campo a campo
O analisador divide a expressão em seus cinco componentes - minuto, hora, dia do mês, mês, dia da semana - e mostra o que cada um contribui Isso importa porque os erros de cron são quase sempre um problema de campo único: o valor certo na coluna errada. 0 12 * * * (dia do meio-dia) e 12 0 * * * (12:12 da manhã diariamente... Não, 00:12 diariamente) estão a uma troca. Ver "hora: 0" rotulado explicitamente é como você pega essa troca em dois segundos em vez de duas semanas.
Suporte para intervalos, etapas e listas
As expressões do mundo real se apoiam na sintaxe da operadora: 1-5 intervalos, */10 passos, 1,15 Listas e combinações como 0 8-18/2 * * 1,3,5. O analisador lida com tudo isso, incluindo os formulários combinados que atrapalham os leitores humanos. Valores de etapas em intervalos - 8-18/2 significando & quot;a cada 2 horas de 8 a 18 & quot; - são legais, úteis e quase ilegíveis sem ferramentas Se você & #39; já herdou um crontab cheio destes de um sysadmin que partiu, você sabe por que esse recurso existe.
Validação estrita de cinco campos (incluindo o que não aceita)
O analisador recebe expressões padrão de cinco campos e nada mais. cola @daily e você obtém um erro - & quot; Esperado 5 campos (minuto hora dia-do-mês mês dia-da-semana), obteve 1 & quot; - não uma tradução. Mesmo para @hourly, @weekly, e @reboot. Isso é uma lacuna genuína em vez de um princípio de design, e eu prefiro dizer isso do que permitir que você descubra no meio da depuração; As macros abreviadas são comuns o suficiente em crontabs reais que pertencem à ferramenta. Até que eles estejam dentro, traduza manualmente: @hourly é 0 * * * *, @daily é 0 0 * * *, @weekly é 0 0 * * 0, @monthly é 0 0 1 * *, @yearly é 0 0 1 1 *. @reboot não tem nenhum equivalente de cinco campos - é o & #39; é um cronograma, é executado uma vez na inicialização do daemon, um fato que surpreendeu muitas pessoas que realizam migrações do crontab.
O rigor compensa em outro lugar. Uma expressão de quartzo de seis campos é rejeitada com uma contagem de campo em vez de ser interpretada de forma incorreta. Valores fora da faixa Nomeie o campo e o intervalo legal (Value 25 out of range for hour (allowed 0-23)). intervalos invertidos como 5-1 são capturados. E aceita as coisas que os crontabs reais contêm: nomes de meses e dias (JAN, SUN), 7 Como uma segunda ortografia de domingo, e o Vixie 5/15 Forma significando "Cada 15 a partir de 5". Vale a pena saber enquanto você traduz as macros manualmente: cada @daily o trabalho em um servidor dispara no mesmo instante - meia-noite - então quarenta deles é um pico de carga noturno Eu espalho o meu em minutos ímpares (17 3 * * *, 43 4 * * *) exatamente por esse motivo.
Processamento do lado do cliente
O analisador é executado inteiramente no seu navegador. Nada que você cola é carregado, registrado ou armazenado. Isso soa como linguagem de privacidade clichê até você lembrar o que realmente contém: o cronograma de backup, o tempo de execução do faturamento, o minuto exato em que sua segurança digitaliza. O agendamento de infraestrutura é um dado de reconhecimento. Mantê-lo fora dos servidores de outras pessoas não é paranoia; apenas não está criando um problema onde nenhum precisa existir.
Como usar o analisador cron
Etapa 1: colar ou digitar sua expressão
abra o analisador de cron e coloque a expressão - de um arquivo crontab, a schedule: Bloqueie um fluxo de trabalho do GitHub Actions, um manifesto do Kubernetes Cronjob ou um Laravel ->cron() ligue. A sintaxe padrão de cinco campos funciona como está; @daily E seus irmãos não, então expanda primeiro para cinco campos. Em seguida, pressione a análise. Se você estiver começando do zero em vez de decodificar, os botões predefinidos (cada minuto, hora, diariamente à meia-noite, dias da semana 9h, 1º do mês) carregam uma expressão de trabalho que você pode modificar campo por campo, reanalisando à medida que avança.
Passo 2: leia a tradução de volta
Este é o passo que as pessoas pulam e devem' t. Leia a saída em inglês simples e compare-a com a frase na sua cabeça Se você escreveu a expressão pretendendo & quot; todas as segundas-feiras às 9 AM" e o readback diz & quot; Às 09:00 no dia-do-mês 1 & quot; - parabéns, você acabou de pegar a troca de coluna clássica antes da produção fez O readback é o seu teste de unidade.
Etapa 3: verificar os próximos tempos de execução
Verifique as cinco próximas execuções As datas chegam onde você espera? a primeira corrida é esta noite, amanhã ou no próximo mês? preste atenção à lacuna entre as corridas - um extraviado */ Passo vira "a cada 6 horas" em "a cada minuto de cada 6 horas" (* */6 * * * VS 0 */6 * * *), e cinco corridas com um minuto de diferença em vez de seis horas de intervalo é difícil de perder. Uma lista vazia significa que a programação nunca pode ser disparada.
Etapa 4: conta para o fuso horário antes de implantar
O analisador informa quando em relação a um relógio; seu agendador decide de quem relógio. Antes de implantar, confirme qual fuso horário o sistema de execução usa. Ações do GitHub: sempre UTC, sem exceções. Servidores: qualquer que seja o sistema operacional definido, frequentemente UTC em caixas de nuvem. Laravel: o fuso horário do seu aplicativo, a menos que você encadeie ->timezone(). Traduza um próximo tempo de execução através do conversor de carimbo de data/hora Se você precisar vê-lo em sua zona local ou em um cliente.
Mergulho Profundo Técnico: Como as expressões cron realmente funcionam
O formato de cinco campos vem do Unix cron, padronizado na prática por Paul Vixie' s cron implementação no final dos anos 1980 - o documentado em crontab(5) E ainda enviando, em forma descendente, na maioria dos sistemas Linux atualmente. Os campos da esquerda para a direita:
| campo | Valores permitidos | notas |
|---|---|---|
| minuto | 0–59 | |
| hora | 0–23 | Relógio de 24 horas, 0 é meia-noite |
| dia do mês | 1–31 | Cuidado meses sem um 31º |
| mês | 1–12 ou janeiro–dezembro | Nomes permitidos no Vixie Cron |
| dia da semana | 0–7 ou sol – Sáb | 0 e 7 são domingo |
Cada campo aceita * (qualquer valor), listas (1,15), intervalos (1-5), e passos (*/10 ou 20-59/5). Isso's toda a gramática. A complexidade é ' t na sintaxe - it' s em três peculiaridades comportamentais.
Quirk One: o zero do dia da semana. por crontab(5), ambos 7 significam domingo Alguns implementações mais antigas ou mais rigorosas aceitam apenas 0. Quartz - o agendador Java usado por Jenkins e metade do software empresarial - números dias 17 começando em domingo, então quartzo 2 é segunda-feira, enquanto Crontab 2 é terça. Se você migrar horários entre os sistemas, este está de pé. Sempre analise, nunca transcreva.
Quirk Two: Dia do mês ou dia da semana. Aqui está aquele que quase ninguém conhece até que ele os morda. quando ambos Os campos do dia do mês e do dia da semana são restritos (nenhum é *), vixie cron executa o trabalho quando também correspondências - um OR, não um AND. Então 0 0 13 * 5 Não significa "sexta-feira, 13", significa "a cada 13 do mês e todas as sextas-feiras". crontab(5) E é profundamente contra-intuitivo. Se você realmente precisar de "sexta-feira, dia 13", você precisa de uma verificação de data do lado do script ou de um agendador com uma sintaxe mais rica.
Quirk Three: Timezones e DST. O cron não possui um campo de fuso horário. A expressão é interpretada na hora local do planejador, seja lá o que for. Duas consequências concretas:
- Ações do GitHub são executadas
schedule:Acionadores em UTC, ponto final. um fluxo de trabalho programado para0 9 * * *incêndios às 9 AM UTC - 4 ou 5 AM em Nova York, dependendo da estação, porque UTC não & #39; t observar DST mas seu público-alvo & #39; s relógio faz Seu & quot;9 AM relatório diário & quot; deriva por uma hora duas vezes por ano, a menos que você ajustar o fluxo de trabalho ou lidar com ele em código. - Nos servidores definidos para uma zona de observação de DST, uma noite por ano, as 02:00h às 03:00h não existe e uma noite acontece duas vezes. Um trabalho agendado às 02:30 salta ou dispara, dependendo da implementação. A correção chata e correta: agendar trabalhos críticos fora de 01:00–03:00 local ou executar servidores no UTC. eu faço os dois.
Formatos estendidos. O Quartz usa seis ou sete campos (campo de segundos líderes e um ano final opcional), além de operadores extras como L (último), W (dia da semana mais próximo) e # (no dia da semana do mês).Alguns crões suportam um campo de segundos à esquerda também Se a sua expressão tem seis campos e você' não tem certeza de qual dialeto é, cole-o no analisador - uma expressão de seis campos interpretada como cinco campos produzirá saída visivelmente errada, que é em si diagnóstica E @reboot, o pato estranho das strings especiais, não é uma programação: ele é executado uma vez na inicialização do daemon, o que em sistemas modernos significa "sempre que a caixa é reiniciada", um fato que surpreendeu muitas pessoas que executam migrações de banco de dados do Crontab.
Para um tour mais amplo dos utilitários do desenvolvedor que combinam com o trabalho de agendamento, o Guia de ferramentas de codificação Cobre toda a caixa de ferramentas.
Casos de uso comuns
Depurando uma entrada do Agendador Laravel
Laravel' s agendador envolve cron em métodos fluentes - ->dailyAt('03:00'), ->weeklyOn(1, '8:00')- mas a escotilha de fuga, ->cron('*/5 * * * 1-5'), é a sintaxe do crontab bruto e agendas complicadas acabam por aí. O sistema Crontab é executado schedule:run A cada minuto, e Laravel decide internamente o que é devido. Quando um comando agendado não está disparando, meu primeiro passo é colar o ->cron() String no analisador para confirmar que significa o que o comentário acima afirma. Cerca de metade das vezes, não. a outra metade, o bug é fuso horário: o aplicativo está definido para UTC enquanto o desenvolvedor assumiu a hora local. O analisador resolve o primeiro caso em segundos e aponta o dedo para o segundo.
Desembaraçar o WP-Cron em sites WordPress
O WordPress vem com wp-cron, que é o & #39; t cron - it' s um pseudo-agendador que pega carona nas visitas à página, portanto, um site de baixo tráfego & #39; s " horly" job pode funcionar a cada quatro horas, e um site de alto tráfego paga um pequeno imposto em cada solicitação Durante meus anos WP Adminify isso gerou um fluxo constante de " postagens programadas são & #39; t publishing" relatórios. A correção padrão é desativadora do wp-cron (wp-cron)DISABLE_WP_CRON) e acionando wp-cron.php de um crontab de servidor real - momento em que você & #39; está escrevendo expressões cron reais, geralmente */5 * * * *, e o analisador ganha seu continuo verificando-os. Se você executar o WordPress em qualquer escala, vale a pena fazer essa migração esta semana, não em algum dia.
Verificando os agendamentos das ações do GitHub
As agendas de CI falham silenciosamente: uma compilação noturna que para de ser executada não faz uma página de ninguém. Ao escrever um schedule: trigger, EU analiso a expressão, olho para os próximos tempos de execução, depois adiciono mentalmente o deslocamento UTC Dois detalhes extras específicos para Actions: os cronogramas são executados apenas no branch padrão e as execuções podem ser atrasadas ou descartadas durante períodos de alta carga - GitHub' os próprios documentos dizem que se o tempo exato importa, as Ações acionadas por cron são a ferramenta errada; se o tempo aproximado for bom, pelo menos faça o tempo aproximado o direito Tempo aproximado.
Auditando um Crontab herdado
Todo servidor de longa duração acumula um crontab escrito por pessoas que não trabalham mais lá. corrida crontab -l e colar cada linha no analisador é a auditoria mais rápida que conheço: em dez minutos você tem um inventário de programação em inglês simples e quase sempre encontrará pelo menos um trabalho fazendo algo que ninguém lembrava - um backup rodando duas vezes, um script de limpeza que nunca correspondeu ao dia em que deveria, a * * * * * isso deveria ter sido 0 * * * * martelando uma API sessenta vezes por hora. Ao comparar um crontab antigo com um novo durante uma migração, o ferramenta diff de texto Juntamente com o analisador, a revisão mecânica.
Agendando o Kubernetes Cronjobs
K8S CronJobs usa sintaxe padrão de cinco campos e, desde 1.27, suportam um explícito timeZone campo - uma melhoria genuína em relação ao cron clássico O fluxo de trabalho do analisador é o mesmo: verifique a expressão, verifique as próximas execuções e confirme startingDeadlineSeconds e concurrencyPolicy Cubra os modos de falha que o próprio cron não. Uma expressão pode ser perfeita e o trabalho ainda se acumula se uma execução lenta se sobrepõe ao próximo gatilho; o analisador acerta a programação para que você possa gastar sua atenção nessas configurações operacionais.
dialetos cron comparados
| Vixie Cron / Crontab | Ações do GitHub | quartzo | agendador laravel | temporizadores systemd | |
|---|---|---|---|---|---|
| campos | 5 | 5 | 6–7 (segundos, ano) | 5 (via ->cron()) |
OnCalendar Sintaxe, não cron |
| Numeração do dia da semana | 0–7 (0 e 7 = sol) | 0–6 (0 = sol) | 1–7 (1 = sol) | segue crontab | Nomes (Mon, Tue) |
| fuso horário | sistema local | sempre utc | configurável | fuso horário do aplicativo ou ->timezone() |
sistema local ou Timezone= |
| cordas especiais | @daily, @reboot, etc |
não suportado | não suportado | métodos fluentes em vez disso | OnBootSec=, taquigrafias de calendário |
| Precisão de segundos | não | Não (mínimo ~ 5 minutos prático) | sim | Não (tiqueta por minuto) | sim |
| melhor para | Trabalhos de servidor | Agendamentos de CI/CD | Ecossistemas JVM | Aplicativos Laravel | Serviços modernos do Linux |
Quando usar qual: crontab para trabalhos simples de servidor, temporizadores systemd quando você deseja registro e manipulação de dependência gratuitamente no Linux moderno, o agendador de framework quando o trabalho vive dentro do seu aplicativo de qualquer maneira e agendamentos de ações apenas para tarefas CI que toleram tempo difuso O que quer que você escolha, a expressão de cinco campos é a língua franca - e é por isso que um analisador que fala fluentemente pertence aos seus marcadores ao lado do resto do seu Kit de ferramentas para desenvolvedores web.
FAQ
O que é um analisador de expressão cron?
Um analisador de expressão cron é uma ferramenta que lê sintaxe crontab - como */15 9-17 * * 1-5- e traduz-o numa descrição de programação em inglês simples, normalmente juntamente com uma antevisão dos próximos tempos de execução Ele permite verificar o que um cronograma realmente faz antes de implantá-lo, em vez de descobrir um campo mal lido quando um trabalho é disparado na hora errada na produção.
O que significam os cinco campos em uma expressão cron?
Da esquerda para a direita: minuto (0–59), hora (0–23), dia do mês (1–31), mês (1–12) e dia da semana (0–7, onde 0 e 7 significam domingo). Cada campo aceita * Para qualquer valor, listas de vírgulas, intervalos de hífen e / Valores da etapa. por isso 30 2 1 * * Significa 02:30 no primeiro dia de cada mês.
Por que meu trabalho cron é executado na hora errada?
As duas causas mais comuns são confusão de fuso horário e campo Cron é executado no scheduler' s hora local - GitHub Actions sempre usa UTC, e muitos servidores em nuvem também - então um trabalho agendado para o & quot;9 AM & quot; pode disparar horas fora do seu relógio de parede O outro clássico é trocar campos, como colocar o valor da hora na coluna minuto Analisando a expressão e verificando os tempos de próxima execução captura ambos.
são 0 e 7, ambos domingos em cron?
No Vixie cron e na maioria das implementações Linux, sim - o crontab(5) A página de manual permite 0 e 7 para domingo. Mas isso não é universal: quartzo, dias 1 a 7, começando no domingo, e alguns parsers estritos rejeitam 7. Ao mover expressões entre sistemas, verifique novamente o campo do dia da semana, em vez de assumir que a numeração é continuada.
O que faz 0 0 13 * 5 realmente fazer?
Não "Sexta-feira, 13", quando o dia do mês e o dia da semana são restritos, o padrão Cron os trata como uma sala de cirurgia: o trabalho é executado a cada 13 do mês e todas as sextas-feiras. Isso é um comportamento documentado do VIXIE Cron e uma das regras mais incompreendidas do formato. Se você precisar de uma verdadeira e, adicione uma verificação de data dentro do próprio script.
Como o horário de verão afeta os empregos cron?
Em servidores em fusos horários de observação de DST, os trabalhos agendados entre 01:00h e 03:00h podem pular uma corrida (quando os relógios avançam) ou duas vezes (quando recaem), dependendo da implementação. Os padrões mais seguros são executar servidores em UTC ou agendar trabalhos críticos fora dessa janela. Observe que agendadores baseados em UTC, como ações do GitHub, não pulam as corridas, mas a hora local correspondem a turnos em uma hora duas vezes por ano.
é @daily o mesmo como 0 0 * * *?
Sim - @daily (e seu sinônimo @midnight) expande para exatamente 0 0 * * * em Vixie Cron. Duas ressalvas. Primeiro, o analisador Toolz.dev aceita apenas expressões de cinco campos, então cole 0 0 * * * em vez de @daily Por enquanto. Em segundo lugar, cada @daily O trabalho é disparado no mesmo instante, então um servidor com muitos deles recebe um pico de carga à meia-noite. Espalhar trabalhos diários por minutos e horas escalonados evita aquele rebanho trovejante auto-infligido.
O analisador Toolz.dev cron carrega minhas expressões?
não . o analisador de cron é executado inteiramente em seu navegador - as expressões são analisadas no lado do cliente e nunca enviadas para um servidor, registradas ou armazenadas, uma vez que os crontabs revelam detalhes operacionais como tempo de backup e execuções de cobrança, mantê-los fora dos servidores de terceiros é um padrão sensato, e você mesmo pode confirmar o comportamento em seu navegador & #39; s Guia de rede.
leia de volta antes de enviar
Cinco semanas de e-mails digeridos chegando um dia atrasado não é uma interrupção dramática Ninguém me pagaram Isso & #39; s exatamente o que torna os bugs de agendamento caros: eles don & #39; t se anunciam, eles apenas silenciosamente fazem a coisa errada até que um cliente menciona de passagem O hábito que corrigiu para mim é & #39; t disciplina ou uma memória melhor para ordem de campo - it & #39; s um readback de trinta segundos Colar a expressão, ler a frase em inglês, olhar para cinco datas concretas, em seguida, implantar.
mantenha o analisador de cron Ao lado das ferramentas que você encontrará na mesma sessão de depuração: o conversor de carimbo de data/hora Quando um próximo tempo de execução precisa se mover entre as zonas (eu escrevi o Armadilhas de carimbo de data/hora do Unix aquela mordida mais dura), o Calculadora de diferença de datas Para intervalos de verificação de sanidade, e o ferramenta diff de texto Quando você está comparando um Crontab antigo com um novo durante uma migração. o Guia de ferramentas de codificação percorre como o conjunto se encaixa e tudo é executado no lado do cliente - o que, para um arquivo que documenta exatamente quando seus backups e faturamento são acionados, é o único padrão sensato.



