Calcularea următoarelor execuții ale unei expresii cron

analizează și afișează următoarele date de execuție ale configurației cron

Ce este o expresie cron?

O expresie cron este un șir scurt care descrie o recurență în timp. Formatul moștenit de la Unix se compune din cinci câmpuri separate prin spații: minut, oră, zi din lună, lună și zi din săptămână. Această sintaxă s-a născut cu demonul cron al lui Brian Kernighan în anii 1970, apoi generalizată de Vixie cron (1987) preluat de toate distribuțiile Linux și macOS moderne. Astăzi, aceeași sintaxă se regăsește în majoritatea planificatorilor cloud (AWS EventBridge, GCP Cloud Scheduler, Azure Logic Apps) și CI/CD (GitHub Actions, GitLab CI, Jenkins).

┌──── minut (0-59)
│ ┌── oră (0-23)
│ │ ┌── zi din lună (1-31)
│ │ │ ┌── lună (1-12 sau JAN-DEC)
│ │ │ │ ┌── zi din săptămână (0-7 sau SUN-SAT, 0 și 7 = duminică)
│ │ │ │ │
* * * * *

O expresie cron bine formată definește deci un cron schedule precis: fiecare câmp poate fi o valoare fixă, un interval, o listă, un pas sau un asterisc care se potrivește la tot. Compactitatea expresiei crontab este forța sa, dar este de asemenea ceea ce face un cron decoder indispensabil pentru a valida vizual intenția. Acesta este întregul obiect al acestui cron converter: a produce o explicație cron lizibilă, plus lista următoarelor execuții.

Anatomia unei expresii cron

Cele cinci câmpuri împărtășesc o gramatică comună. Iată limitele acceptate de fiecare coloană a unei expresii crontab standard:

  • Minut: 0-59.
  • Oră: 0-23, format 24h.
  • Zi din lună: 1-31.
  • Lună: 1-12 sau abrevierile textuale JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC.
  • Zi din săptămână: 0-7 unde 0 și 7 reprezintă amândouă duminica, sau abrevierile SUN, MON, TUE, WED, THU, FRI, SAT.

Caractere speciale împărtășite de cele cinci câmpuri:

  • *: any value, se potrivește cu toate valorile autorizate ale câmpului.
  • ,: listă discretă, de exemplu 1,15,30 în câmpul minut.
  • -: interval inclusiv, de exemplu 9-17 pentru orele de birou.
  • /: pas (step), de exemplu */15 = la fiecare 15 unități, sau 0-30/5 = la fiecare 5 minute între 0 și 30.

Extensii Quartz (Java, AWS EventBridge, Spring): gramatica urcă la 6 sau 7 câmpuri cu o coloană secunde în cap (0-59) și uneori o coloană an în coadă (1970-2099). Quartz introduce de asemenea ? (no specific value, pentru a decupla zi-din-lună și zi-din-săptămână), L (last: ultima zi a lunii, sau ultima vineri cu 5L), W (zi lucrătoare cea mai apropiată) și # (a N-a zi a săptămânii a lunii, de exemplu 2#3 pentru al 3-lea luni). O expresie Quartz nu este în general compatibilă cu un crontab UNIX, și viceversa: este principala sursă de eroare când copiezi o cron expression de la o platformă la alta. Decoder-ul nostru vizează formatul cu 5 câmpuri, care acoperă majoritatea planificatorilor.

# UNIX / Vixie cron (5 câmpuri)
0 9 * * 1-5

# Quartz (6 câmpuri cu secunde)
0 0 9 ? * MON-FRI

# Quartz (7 câmpuri cu an)
0 0 9 ? * MON-FRI 2026

De ce să decodezi o expresie cron?

A citi 0 0 * * * este rapid. A citi */7 2-5 1,15 * 1-5 este net mai puțin. Când o expresie iese din trivial, riscul de eroare de interpretare urcă și cron decode devine o etapă de review în sine.

  • Debug producție: a înțelege de ce o sarcină s-a declanșat la 03h17 și nu la 03h00, sau a identifica o suprapunere între două joburi.
  • Code review: a valida că un planificator împins într-un pull request face într-adevăr ce pretinde autorul, fără a fi nevoie să memorezi semantica fiecărui simbol.
  • Audit de planificatori: a trece în revistă cron job-urile Linux din /etc/crontab și /etc/cron.d/, trigger-urile Jenkins, spec.schedule-urile Kubernetes CronJob, regulile AWS EventBridge și job-urile GCP Cloud Scheduler.
  • Migrare legacy: a relua un /etc/crontab istoric fără documentație și a reconstrui cartografia sarcinilor înainte de o schimbare de infrastructură.
  • Onboarding: a permite unui nou dezvoltator să relucreze o crontab fără a fi nevoie să învețe toate caracterele speciale dintr-o zi pe alta.

Cum să utilizezi decoder-ul cron

Pașii de urmat pentru a decoda o expresie crontab cu instrumentul:

  1. Lipește cron expression-ul tău în câmpul de intrare (5 câmpuri separate prin spații).
  2. Indică numărul de execuții următoare de calculat.
  3. Apasă pe convert pentru a lansa cron decode-ul: instrumentul returnează o frază umană care explică declanșarea, plus lista datată a execuțiilor următoare.
  4. Verifică vizual că datele corespund intenției tale (oră, zi, frecvență).
  5. Copiază ieșirea prin butonul de copiere pentru a o lipi într-un tichet, un PR sau o documentație tehnică.

Instrumentul nu se mulțumește cu un parsing sintactic: furnizează o explicație cron în limbaj natural, ceea ce face din el atât un cron decoder cât și un validator de planificare.

Exemple clasice de cron expression

Pattern-urile de mai jos acoperă esențialul cron schedule-urilor întâlnite în producție. Sunt toate valide pe Linux crontab, Kubernetes CronJob, GitHub Actions și majoritatea planificatorilor aplicativi.

Expresie Citire umană
* * * * * La fiecare minut
0 * * * * În fiecare oră fix
0 0 * * * În fiecare zi la miezul nopții
0 0 * * 0 În fiecare duminică la miezul nopții
*/15 * * * * La fiecare 15 minute
0 9 * * 1-5 9h00 de luni până vineri
0 0 1 * * Pe 1 a fiecărei luni la miezul nopții
0 0,12 * * * La miezul nopții și prânz în fiecare zi
*/5 9-17 * * 1-5 La fiecare 5 minute în orele lucrătoare
30 2 1,15 * * Pe 1 și 15 a lunii la 2h30

Pentru a executa o sarcină cron pe un server Linux, se editează crontab-ul utilizator din shell:

# editare crontab al utilizatorului curent
$ crontab -e

# listare sarcinilor existente
$ crontab -l

# exemplu de linie adăugată: backup zilnic la 3h
0 3 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1

Exemplu de ieșire a cron converter-ului pentru */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
...

Întrebări frecvente despre cron decoder

Care este diferența între cron UNIX și Quartz?

UNIX/Vixie cron utilizează 5 câmpuri (minut până la zi-din-săptămână), fără precizie la secundă, și nu are noțiunea nativă de "ultima zi a lunii". Quartz (Java, Spring, AWS EventBridge) adaugă o coloană secunde în cap, uneori o coloană an în coadă, și mai multe simboluri (?, L, W, #) absente din crontab-ul Linux. O expresie cron Quartz cu 6 câmpuri nu este deci direct portabilă spre /etc/crontab, și invers. Cron decoder-ul nostru vizează formatul cu 5 câmpuri, care acoperă majoritatea planificatorilor.

Cum să execut o sarcină cron la fiecare 5 minute?

Cu pasul / pe câmpul minut:

*/5 * * * * /usr/local/bin/check-health.sh

Această crontab expression declanșează scriptul la minutele 0, 5, 10, 15... ale fiecărei ore, în fiecare zi. Pentru a limita la orele lucrătoare de luni până vineri, adaugă constrângerile pe câmpurile oră și zi-din-săptămână: */5 9-17 * * 1-5.

Ce înseamnă asteriscul (*) într-o expresie cron?

Asteriscul înseamnă any value: se potrivește cu toate valorile autorizate ale câmpului. În 0 0 * * *, cele trei stele înseamnă "orice zi a lunii, orice lună, orice zi a săptămânii". Combinat cu primele două câmpuri fixate la 0, se obține "în fiecare zi la miezul nopții". Steaua se poate combina și cu un pas: */15 la minut = la fiecare 15 minute.

Are crontab un fus orar?

Implicit, fusul serverului. Pe un crontab Linux, este TZ-ul sistem (adesea UTC pe VPS-uri și containere). GitHub Actions forțează UTC. Kubernetes CronJob utilizează fusul controlerului, configurabil prin spec.timeZone din 1.27. AWS EventBridge evaluează expresiile în UTC. Planificatorii aplicativi (Symfony Scheduler, Quartz, Airflow) permit adesea fixarea unui fus dedicat fiecărei sarcini. În caz de dubiu, verifică date pe serverul țintă și compară cu ieșirea cron converter-ului.

Cron job vs comanda at: pe care să o aleg?

cron servește la executarea unei sarcini recurente conform unei planificări. at servește la executarea unei comenzi o singură dată la un moment dat. Pentru un backup zilnic, o rotație de log-uri sau un apel API regulat, utilizează cron. Pentru a amâna o operație unică ("relansează acest deploy la 22h în această seară"), utilizează at:

$ echo "/usr/local/bin/deploy.sh" | at 22:00
Cum să testez o expresie cron fără să o declanșez?

Este exact rolul acestui cron converter: calculează N următoarele execuții din momentul curent, fără a porni vreun job. Vezi imediat dacă crontab expression-ul tău trage la 03h00 cum este prevăzut sau la 03h17 din întâmplare. Pentru a merge mai departe înainte de a instala sarcina, poți de asemenea testa scriptul singur (bash -x script.sh) și a verifica sintaxa unui fișier crontab cu crontab -T fisier pe distribuțiile care îl suportă.

Ce se întâmplă dacă zi-din-lună și zi-din-săptămână sunt amândouă fixate?

Pe Vixie cron (Linux), regula este un SAU logic: job-ul trage dacă unul sau altul dintre cele două câmpuri se potrivește. Este contraintuitiv și sursă de bug-uri. Quartz utilizează un ȘI, de unde introducerea simbolului ? pentru a semnala explicit "fără constrângere". Ca regulă generală, fixează doar unul dintre cele două câmpuri.

Exemplu de cerere

curl -X POST https://cdrn.fr/api/v1/tools/cron-converter/execute \
  -H "Content-Type: application/json" \
  -d '{"cron":"...","number_next_date":1}'

Schema de intrare

Câmp Tip Obligatoriu Implicit
cron string
number_next_date integer

Puncte de acces

  • GET https://cdrn.fr/api/v1/tools - listează toate instrumentele disponibile
  • GET https://cdrn.fr/api/v1/tools/cron-converter - obține schema acestui instrument
  • POST https://cdrn.fr/api/v1/tools/cron-converter/execute - execută acest instrument cu un payload JSON