Construirea unei expresii cron

construiește o expresie cron din câmpuri vizuale sau un preset (în fiecare minut, orar, zilnic, săptămânal...)

De ce un cron builder vizual?

O expresie cron ține în cinci câmpuri și rămâne totuși una dintre cele mai generatoare de bug-uri în producție. De câte ori un dezvoltator a scris 0 0 * * 1 gândindu-se "în fiecare luni", fără să-și amintească că 1 poate semnifica duminică în funcție de implementări? De câte ori a fost confundat */15 cu 15? Cron builder-ul răspunde acestei nevoi: a compune vizual o crontab expression, plecând de la preseturi curente sau de la câmpuri individuale, și a obține expresia finală gata de lipit într-un crontab Linux, un Kubernetes CronJob sau un schedule GitHub Actions.

Instrumentul este inversul decoderului nostru cron: acolo unde converterul ia o expresie și derulează următoarele execuții, builderul ia alegeri umane și produce expresia cron corespunzătoare.

Cum funcționează

Interfața grafică propune două moduri de compoziție complementare:

  • Mod preset: un selector de frecvență (every minute, every hour, every day, every week, every month, every year, custom) care generează imediat o cron expression validă.
  • Mod câmpuri: cinci câmpuri editabile (minut, oră, zi din lună, lună, zi din săptămână) unde introduci liber *, un întreg, un interval 1-5, o listă 1,15,30 sau un pas */15.

Builderul actualizează expresia în timp real și afișează o citire umană succintă ("în fiecare zi la 3h", "la fiecare 15 minute") care servește drept protecție: dacă fraza nu se potrivește cu intenția ta, expresia este probabil greșită.

Cele cinci câmpuri cron, în clar

O expresie cron standard conține cinci câmpuri separate prin spații:

minut  ora  ziua-din-luna  luna  ziua-din-saptamana
*       *      *             *     *
  • minut (0 la 59);
  • oră (0 la 23);
  • zi din lună (1 la 31);
  • lună (1 la 12 sau abrevieri Jan, Feb, etc.);
  • zi din săptămână (0 la 7, 0 și 7 reprezentând amândouă duminica în majoritatea implementărilor).

Fiecare câmp acceptă mai multe forme: * (toate valorile), un întreg precis (5), o listă (1,3,5), un interval (9-17), un pas (*/15 la fiecare 15 valori), sau o combinație (0-30/5).

Cazuri de utilizare tipice

  • Dezvoltator care învață cron: vizualizarea cum interacționează fiecare câmp, fără să riști o expresie greșită în producție.
  • Sysadmin grăbit: generarea în câteva secunde a unui schedule pentru un cron Linux, un Kubernetes CronJob sau un job Ansible fără să relucrești pagina man.
  • Dezvoltator fără experiență POSIX: producerea unei crontab expression valide pentru Symfony Scheduler, Laravel Scheduler sau node-cron fără a cunoaște sintaxa istorică.
  • DevOps în review: prototiparea rapidă a unei expresii de propus într-un pull request, apoi validarea sa cu decoder-ul cron.
  • Migrare legacy: reformularea unei expresii cron istorice trecând prin builder pentru a te asigura de semantică înainte de a o împinge în altă parte.

Preseturi curente

Selectarea unui preset suprascrie câmpurile individuale și produce expresia corespunzătoare:

  • În fiecare minut: * * * * *. De evitat în producție în afara unei nevoi particulare.
  • În fiecare oră: 0 * * * *. La fiecare început de oră.
  • În fiecare zi: 0 0 * * *. La miezul nopții.
  • În fiecare săptămână: 0 0 * * 0. În fiecare duminică la miezul nopții.
  • În fiecare lună: 0 0 1 * *. Pe 1 a lunii la miezul nopții.
  • În fiecare an: 0 0 1 1 *. Pe 1 ianuarie la miezul nopții.

Pattern-uri curente de cunoscut

Expresie Citire umană
0 0 * * * În fiecare zi la miezul nopții
*/15 * * * * La fiecare 15 minute
0 9 * * 1-5 În fiecare zi lucrătoare la 9h
0 0 1 * * Pe 1 a lunii la miezul nopții
0 0 * * 0 În fiecare duminică la miezul nopții
*/5 9-17 * * 1-5 La fiecare 5 minute în orele lucrătoare
0 3 * * * În fiecare zi la 3h dimineața
30 2 1,15 * * Pe 1 și 15 a lunii la 2h30

Compunerea unei expresii personalizate

Pentru cazuri mai specifice, asistentul expune cele cinci câmpuri în intrare liberă. Câteva exemple utile:

  • În fiecare zi la 3h dimineața: minut=0, oră=3, alte câmpuri *.
  • La fiecare 15 minute: minut=*/15, alte câmpuri *.
  • De luni până vineri la 9h: minut=0, oră=9, zi-din-săptămână=1-5.
  • În fiecare 1 și 15 a lunii la prânz: minut=0, oră=12, zi-din-lună=1,15.
  • La fiecare 5 minute între 9h și 17h: minut=*/5, oră=9-17.

Cum să utilizezi cron builder-ul

  1. Alege un preset (every minute, every hour, every day, every week, every month, every year) care corespunde bazei nevoii tale.
  2. Rafinează dacă este necesar editând direct cele cinci câmpuri (minut, oră, zi din lună, lună, zi din săptămână).
  3. Citește fraza umană generată de instrument pentru a confirma intenția.
  4. Copiază expresia cron produsă prin butonul de copiere.
  5. Validează schedule-ul cu decoder-ul nostru cron care calculează următoarele date de execuție reale.
  6. Lipește expresia în crontab-ul tău Linux, Kubernetes CronJob, Symfony Scheduler sau workflow GitHub Actions.

Capcane clasice

  • Zi din lună și zi din săptămână combinate: dacă cele două nu sunt *, comportamentul diferă în funcție de implementări. Linux/Vixie cron aplică un SAU; bibliotecile moderne au uneori un comportament diferit. De evitat.
  • Ziua 1 = luni sau duminică?: în funcție de țară și convenție. Majoritatea cron Unix consideră duminică=0 și sâmbătă=6. Verifică planificatorul tău.
  • Fus orar: un cron Unix utilizează implicit fusul serverului. Planificatorii aplicativi (Symfony Scheduler, Quartz) permit adesea fixarea unui fus dedicat.
  • Minut lipsă: * * * * * execută job-ul la fiecare minut, ceea ce rar este ce dorim. Gândește-te să fixezi un declanșator precis (0) pentru sarcini orare.

Citire umană și ieșire

Pe lângă expresia cron, instrumentul propune o citire umană succintă ("în fiecare zi la miezul nopții", "la fiecare 5 minute"). Este o protecție: dacă fraza nu corespunde intenției tale, expresia este probabil greșită. Pentru un caz complex, utilizează apoi decoder-ul nostru cron pentru a calcula următoarele date de execuție reale.

Întrebări frecvente

Pot edita manual expresia după utilizarea interfeței?

Da. Builderul nu este un mod exclusiv: cele cinci câmpuri rămân editabile în orice moment. Poți pleca de la un preset, apoi să ajustezi un câmp manual pentru a obține o crontab expression personalizată. Citirea umană este recalculată imediat.

Instrumentul suportă formatul Quartz cu 6 câmpuri (cu secunde)?

Nu: formatul cu 5 câmpuri este standardul Unix și baza comună a majorității planificatorilor (Linux crontab, Kubernetes CronJob, GitHub Actions, GitLab CI, Symfony Scheduler, Laravel Scheduler). Quartz (Java) acceptă un câmp suplimentar pentru secunde și simboluri specifice (?, L, W, #), dar această nevoie rămâne rară.

Cum este gestionat fusul orar?

Builderul produce o expresie cron neutră: este motorul care execută job-ul ce aplică fusul său orar. Pe un crontab Linux, este TZ-ul serverului. Pe GitHub Actions, este UTC. Pe Kubernetes 1.27+, poți fixa spec.timeZone în manifest. Symfony Scheduler și Quartz expun un fus dedicat per sarcină.

Cum să-mi validez expresia fără să o execut în producție?

Utilizează decoder-ul nostru cron. Calculează N următoarele execuții din momentul curent, fără a porni vreun job. Este cea mai bună metodă de a confirma că o cron expression trage într-adevăr la ora prevăzută înainte de a o deploya.

Care este raportul cu Symfony Scheduler?

Symfony Scheduler acceptă expresiile cron cu 5 câmpuri prin Schedule::cron('0 3 * * *', ...) . Expresia produsă de builder poate deci fi lipită ca atare. Idem pentru Laravel Scheduler (->cron('...')), node-cron, Hangfire și Airflow.

Trebuie să prefixez comanda în crontab-ul sistem?

Da, în /etc/crontab trebuie un utilizator (0 3 * * * www-data /usr/bin/php ...), în timp ce crontab -e per utilizator îl omite. Expresia însăși rămâne identică.

Exemplu de cerere

curl -X POST https://cdrn.fr/api/v1/tools/cron-builder/execute \
  -H "Content-Type: application/json" \
  -d '{"preset":"none","minute":"*","hour":"*","day_of_month":"*","month":"*","day_of_week":"*"}'

Schema de intrare

Câmp Tip Obligatoriu Implicit
preset choice (none, every_minute, hourly, daily, weekly, monthly, yearly) none
minute string *
hour string *
day_of_month string *
month string *
day_of_week string *

Puncte de acces

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