Dacă ați gestionat vreodată un server Linux, ați lucrat la dezvoltarea backend sau ați configurat funcții automate în cloud, probabil că ați întâlnit un șir care arată cam așa: 0 2 * * *. Pentru cei neinițiați, pare o greșeală de scriere lăsată pe tastatură. Pentru administratorii de sistem, aceasta este ritmul automatizării infrastructurii moderne: o Expresie Cron.
Cron este motorul invizibil care rulează internetul. Acesta asigură backupul bazei de date la ora 3:00 AM, declanșează e-mailurile pe care le primiți în fiecare luni dimineața și șterge fișierele temporare ale serverului înainte ca acestea să blocheze sistemul. Dar, în ciuda puterii sale, sintaxa este notoriu de dificil de analizat de către oameni. În această scufundare profundă, vom demistifica asteriscurile și vă vom învăța cum să citiți și să scrieți programe cron ca un inginer experimentat DevOps.
Ce este Cron și Crontab?
Cron este un programator de joburi bazat pe timp găsit în sistemele de operare ale computerelor Unix. Numele „cron” provine din cuvântul grecesc pentru timp, chronos. Utilizatorii care creează și întrețin medii software folosesc cron pentru a programa joburi (comenzi sau scripturi shell) pentru a rula periodic la ore, date sau intervale fixe.
Crontab (Cron Table) este fișierul de configurare în care sunt stocate aceste programe. Când editați crontab prin intermediul terminalului, scrieți o listă de instrucțiuni care spun serverului exact ce să execute și când.
Deconstruirea celor 5 asteriscuri
O expresie cron standard constă din 5 câmpuri separate prin spațiu alb. Fiecare câmp reprezintă o anumită unitate de timp și sunt citite întotdeauna de la stânga la dreapta în această ordine exactă:
* * * * * command_to_execute
- - - - -
| | | | |
| | | | +----- Day of the Week (0 - 6) (Sunday=0 or 7)
| | | +------- Month (1 - 12)
| | +--------- Day of the Month (1 - 31)
| +----------- Hour (0 - 23)
+------------- Minute (0 - 59)
Un asterisc (*) înseamnă „orice valoare posibilă pentru acest câmp”. Deci, expresia * * * * * se traduce literal prin: „Alergați în fiecare minut, din fiecare oră, din fiecare zi, din fiecare lună, din fiecare zi a săptămânii”.
Modificatori de sintaxă: pași, intervale și liste
Puterea cron vine de la modificatorii săi. Nu ești limitat doar la anumite numere sau la „totul”.
1. Modificatorul de pași (/)
Dacă doriți ca un script să ruleze la fiecare 15 minute, utilizați un pas. */15 * * * * înseamnă „fiecare minut care este divizibil cu 15”. Acesta va rula la 0, 15, 30 și 45 după ora.
2. Modificatorul de interval (-)
Dacă doriți ca un script să ruleze numai în timpul programului de lucru, utilizați un interval. 0 9-17 * * * înseamnă „a alerga la minutul zero, în fiecare oră de la 9:00 la 17:00”.
3. Modificatorul de listă (,)
Dacă doriți ca ceva să ruleze în anumite zile, non-secvențiale, utilizați o listă. 0 0 1,15 * * înseamnă „a alerga la miezul nopții pe 1 și 15 ale lunii”.
Nu mai ghiciți expresiile Cron
Nu riscați să rulați un script de rezervă în fiecare minut, nu în fiecare lună. O singură greșeală de tipar poate bloca un server de producție. Utilizați generatorul nostru vizual interactiv pentru a construi și valida șirurile cron în siguranță.
Deschideți Cron Job GeneratorCea mai periculoasă greșeală Cron
Cea mai frecventă și catastrofală greșeală pe care o fac dezvoltatorii este confuzia câmpului „Minut”. Să ne uităm la un scenariu în care doriți să rulați un script de curățare a bazei de date o dată pe oră, la 2:00 AM.
Greșeala: * 2 * * *
Dacă scrieți cele de mai sus, îi spuneți serverului să ruleze scriptul „În fiecare minut, în a doua oră a zilei”. Scriptul dvs. greu de curățare a bazei de date se va declanșa de 60 de ori la rând, probabil supraîncărcarea procesorului, blocând tabelele bazei de date și provocând o întrerupere masivă.
Cea corectă: 0 2 * * *
Acest lucru îi spune în mod explicit serverului să ruleze numai la „minutul zero, din a doua oră”. Se va executa exact o dată la 2:00 AM.
Întrebări frecvente (FAQ)
Cron ține cont de fusurile orare?
În mod implicit, cron evaluează expresiile în funcție de ora de sistem local a serverului pe care rulează. Dacă serverul dvs. este găzduit într-o regiune AWS din Londra, acesta rulează pe UTC/GMT. Trebuie să luați în considerare diferențele de fus orar dacă utilizatorii dvs. se află în New York sau Tokyo.
Pot programa o lucrare cron să ruleze în fiecare secundă?
Nu. Cron Unix standard este limitat la o rezoluție de un minut. Dacă aveți nevoie de o programare sub-minută (de exemplu, la fiecare 10 secunde), trebuie să utilizați un instrument separat de demon sau să scrieți un script care rulează în fiecare minut, dar care circulă intern cu comenzi de repaus.
Ce înseamnă șiruri precum @daily sau @hourly?
Multe implementări moderne ale cron acceptă macrocomenzi predefinite non-standard pentru a ușura programarea. @daily este exact la fel cu 0 0 * * * (miezul nopții în fiecare zi). @hourly este același cu 0 * * * *. Deși sunt utile, nu sunt acceptate universal în toate sistemele vechi.