Expresii cron demistificate: Planifică orice sarcină
Trebuie să rulezi o copie de rezervă a bazei de date în fiecare noapte la ora 3. Sau să trimiți un raport în fiecare luni dimineață. Sau să golești un cache la fiecare 15 minute. Pe serverele Linux și Unix, instrumentul pentru aceasta este cron, iar modul în care îi spui când să ruleze ceva este cu o expresie cron.
Expresiile cron par intimidante la prima vedere. 0 3 * * * sau */15 9-17 * * 1-5 pot părea fără sens dacă nu cunoști tiparul. Dar sintaxa este surprinzător de simplă odată ce înțelegi cele cinci câmpuri.
Cele cinci câmpuri
Orice expresie cron standard are exact cinci câmpuri, separate prin spații. Fiecare câmp reprezintă o unitate de timp:
┌───────────── minut (0-59)
│ ┌───────────── oră (0-23)
│ │ ┌───────────── ziua lunii (1-31)
│ │ │ ┌───────────── lună (1-12)
│ │ │ │ ┌───────────── ziua săptămânii (0-7, unde 0 și 7 sunt duminică)
│ │ │ │ │
* * * * *
Atât. Cinci câmpuri, de la stânga la dreapta: minut, oră, ziua lunii, lună, ziua săptămânii.
Știai că? Numele „cron" vine din cuvântul grecesc „chronos", care înseamnă timp. Daemonul cron (procesul de fundal) face parte din sistemele de operare de tip Unix din 1975.
Caracterele speciale
Asterisc (*) — Orice valoare
Un asterisc înseamnă „orice valoare posibilă" pentru acel câmp.
* * * * * = în fiecare minut al fiecărei ore din fiecare zi.
Virgulă (,) — Valori multiple
O virgulă separă valorile individuale.
0 9,12,18 * * * = la minutul 0 al orelor 9, 12 și 18 (9:00, 12:00, 18:00).
Liniuță (-) — Interval de valori
O liniuță definește un interval.
0 9-17 * * * = la minutul 0 al fiecărei ore de la 9 la 17 (de la 9:00 la 17:00, din oră în oră).
Bară oblică (/) — Valori cu pas
O bară oblică definește intervale.
*/15 * * * * = la fiecare 15 minute (minutul 0, 15, 30, 45 al fiecărei ore).
0 */2 * * * = la fiecare 2 ore la minutul 0 (miezul nopții, ora 2, ora 4, ...).
Citirea expresiilor cron: exersează
Să analizăm câteva exemple comune. Pentru fiecare, citește cele cinci câmpuri de la stânga la dreapta.
0 3 * * * — Zilnic la ora 3:00
| Câmp | Valoare | Semnificație |
|---|---|---|
| Minut | 0 | La minutul 0 |
| Oră | 3 | Al orei 3 (3 dimineața) |
| Ziua lunii | * | În fiecare zi |
| Lună | * | În fiecare lună |
| Ziua săptămânii | * | În fiecare zi a săptămânii |
Traducere: „La ora 3:00 în fiecare zi." Alegerea clasică pentru copii de rezervă nocturne.
*/15 * * * * — La fiecare 15 minute
| Câmp | Valoare | Semnificație |
|---|---|---|
| Minut | */15 | La fiecare 15 minute |
| Oră | * | Fiecare oră |
| Ziua lunii | * | Fiecare zi |
| Lună | * | Fiecare lună |
| Ziua săptămânii | * | Fiecare zi |
Traducere: „La fiecare 15 minute, non-stop." Comun pentru verificări de stare și reîmprospătări de cache.
0 9 * * 1-5 — Zilele lucrătoare la ora 9:00
| Câmp | Valoare | Semnificație |
|---|---|---|
| Minut | 0 | La minutul 0 |
| Oră | 9 | Al orei 9 |
| Ziua lunii | * | Fiecare zi |
| Lună | * | Fiecare lună |
| Ziua săptămânii | 1-5 | Luni până vineri |
Traducere: „La ora 9:00, de luni până vineri." Perfect pentru rapoarte zilnice de lucru.
0 0 1 * * — Prima zi a fiecărei luni
| Câmp | Valoare | Semnificație |
|---|---|---|
| Minut | 0 | La minutul 0 |
| Oră | 0 | Al orei 0 (miezul nopții) |
| Ziua lunii | 1 | În ziua 1 |
| Lună | * | Fiecare lună |
| Ziua săptămânii | * | Orice zi a săptămânii |
Traducere: „La miezul nopții în prima zi a fiecărei luni." Folosit pentru rapoarte lunare, facturare sau curățenii.
30 8 * * 1 — Luni la ora 8:30
| Câmp | Valoare | Semnificație |
|---|---|---|
| Minut | 30 | La minutul 30 |
| Oră | 8 | Al orei 8 |
| Ziua lunii | * | Fiecare zi |
| Lună | * | Fiecare lună |
| Ziua săptămânii | 1 | Luni |
Traducere: „La ora 8:30 în fiecare luni." Excelent pentru notificările săptămânale de echipă.
Scrierea propriilor expresii cron
Iată o abordare sistematică:
- Începe cu momentul. „În fiecare zi la ora 3" sau „la fiecare 5 minute în timpul orelor de lucru."
- Completează câmpurile de la stânga la dreapta. Începe cu minutul, apoi ora, ziua lunii, luna, ziua săptămânii.
- Folosește
*pentru „orice." Dacă nu îți pasă de un câmp, folosește*. - Testează înainte de a pune în producție. Verifică întotdeauna că expresia produce programul pe care îl aștepți.
Referință rapidă pentru tipare comune
| Program | Expresie |
|---|---|
| În fiecare minut | * * * * * |
| La fiecare 5 minute | */5 * * * * |
| În fiecare oră | 0 * * * * |
| În fiecare zi la miezul nopții | 0 0 * * * |
| În fiecare zi la ora 3:00 | 0 3 * * * |
| În fiecare luni la ora 9:00 | 0 9 * * 1 |
| Zilele lucrătoare la ora 8:30 | 30 8 * * 1-5 |
| Prima zi a fiecărei luni | 0 0 1 * * |
| La fiecare 15 min, orele de lucru | */15 9-17 * * 1-5 |
| De două ori pe zi (9:00 și 18:00) | 0 9,18 * * * |
| În fiecare duminică la ora 2:00 | 0 2 * * 0 |
Greșeli frecvente
Uitarea că orele sunt 0-23
Ora 13 este 13:00, nu ora 1. O greșeală comună este să scrii 0 1 * * * crezând că rulează la ora 13:00 când de fapt rulează la ora 1:00.
Confuzia cu ziua săptămânii
Duminica poate fi 0 sau 7 (ambele sunt valide). Lunea este 1, sâmbăta este 6. Unii se așteaptă ca lunea să fie 0.
Interacțiunea dintre ziua lunii și ziua săptămânii
Dacă specifici atât ziua lunii cât și ziua săptămânii (niciunul nu este *), majoritatea implementărilor cron rulează sarcina când oricare condiție este îndeplinită, nu când ambele sunt îndeplinite. Aceasta surprinde mulți utilizatori.
Atenție Expresia 0 9 15 * 1 NU înseamnă „la ora 9:00 în ziua de 15, dar numai dacă este luni." Înseamnă „la ora 9:00 în ziua de 15 a fiecărei luni ȘI la ora 9:00 în fiecare luni." Aceasta este o sursă frecventă de comportament neașteptat.
Conștientizarea fusului orar
Cron rulează în fusul orar local al serverului. Dacă serverul este în UTC și ești în București (UTC+2), o sarcină cron 0 9 * * * rulează la ora 11:00 ora ta. Verifică întotdeauna fusul orar al serverului.
Sfat Testează și vizualizează expresiile cron înainte de a le pune în producție: Cum să citești și să testezi expresii cron. Vezi orele de rulare următoare și confirmă că programul corespunde așteptărilor tale.
Construiește și testează expresiile cron:
Gratuit, instant și fără înregistrare.