cron - cron


cron
Dezvoltatori Laboratoarele AT&T Bell
Eliberarea inițială Mai 1975 ; Acum 46 de ani ( 1975-05 )
Scris in C
Sistem de operare Linux , macOS , FreeBSD
Tip Programator de locuri de muncă

Cron utilitarul pentru linia de comandă, de asemenea , cunoscut sub numele de Cron de locuri de muncă este un planificator de locuri de muncă pe Unix de operare sisteme . Utilizatorii care configurează și întrețin medii software folosesc cron pentru a programa lucrări (comenzi sau scripturi shell ) pentru a rula periodic la ore, date sau intervale fixe. De regulă, automatizează întreținerea sau administrarea sistemului - deși natura sa generală îl face util pentru lucruri precum descărcarea fișierelor de pe Internet și descărcarea e - mailurilor la intervale regulate.

Cron este cel mai potrivit pentru programarea sarcinilor repetitive. Programarea sarcinilor unice poate fi realizată folosind utilitarul asociat la .

Prezentare generală

Acțiunile cron sunt conduse de un fișier crontab (tabel cron), un fișier de configurare care specifică comenzile shell pentru a rula periodic pe un anumit program. Fișierele crontab sunt stocate acolo unde sunt păstrate listele de joburi și alte instrucțiuni către demonul cron . Utilizatorii pot avea propriile fișiere crontab individuale și de multe ori există un fișier crontab la nivel de sistem (de obicei în /etcsau un subdirector al /etc) pe care numai administratorii de sistem îl pot edita.

Fiecare linie a unui fișier crontab reprezintă o lucrare și arată astfel:

# ┌───────────── minute (0 - 59)
# │ ┌───────────── hour (0 - 23)
# │ │ ┌───────────── day of the month (1 - 31)
# │ │ │ ┌───────────── month (1 - 12)
# │ │ │ │ ┌───────────── day of the week (0 - 6) (Sunday to Saturday;
# │ │ │ │ │                                   7 is also Sunday on some systems)
# │ │ │ │ │
# │ │ │ │ │
# * * * * * <command to execute>

Sintaxa fiecărei linii se așteaptă la o expresie cron formată din cinci câmpuri care reprezintă timpul pentru executarea comenzii, urmată de o comandă shell de executat.

În timp ce, în mod normal, lucrarea este executată când toate câmpurile de specificare a orei / date se potrivesc cu ora și data curente, există o excepție: dacă atât „ziua lunii” (câmpul 3), cât și „ziua săptămânii” (câmpul 5) sunt restricționate ( nu „*”), atunci una sau ambele trebuie să se potrivească cu ziua curentă.

De exemplu, următorul șterge jurnalul de erori Apache la un minut după miezul nopții (00:01) în fiecare zi, presupunând că shell-ul implicit pentru utilizatorul cron este compatibil cu Bourne shell :

1 0 * * * printf "" > /var/log/apache/error_log

Acest exemplu rulează un program shell numit export_dump.sh la 23:45 (11:45 PM) în fiecare sâmbătă.

45 23 * * 6 /home/oracle/scripts/export_dump.sh

Notă: Este, de asemenea, posibil să specificați */nsă rulați pentru fiecare al n -lea interval de timp. De asemenea, specificarea mai multor intervale de timp specifice se poate face cu virgule (de exemplu, 1,2,3). Cele de mai jos ar afișa „hello world” pe linia de comandă la fiecare 5 minute din fiecare primă, a doua și a treia oră (adică 01:00, 01:05, 01:10, până la 03:55).

*/5 1,2,3 * * * echo hello world

Fișierul de configurare pentru un utilizator poate fi editat apelând crontab -eindiferent de locul în care implementarea efectivă stochează acest fișier.

Unele cronimplementări, cum ar fi ediția a 4-a populară BSD scrisă de Paul Vixie și inclusă în multe distribuții Linux, adaugă un al șaselea câmp: un nume de utilizator de cont care rulează jobul specificat (sub rezerva existenței și permisiunilor utilizatorului). Acest lucru este permis numai în crontabs-urile de sistem - nu și în altele, care sunt atribuite fiecăruia unui singur utilizator pentru configurare. Al șaselea câmp este alternativ folosit uneori pentru an în loc de un nume de utilizator de cont - demonul nncron pentru Windows face asta.

Implementarea Amazon EventBridge a cronului nu utilizează 0 zi bazată pe săptămână, în schimb este 1-7 SUN-SAT (în loc de 0-6), precum și funcții de expresie suplimentare, cum ar fi prima zi a săptămânii și ultima zi a -lună.

Definiții de programare predefinite non-standard

Unele implementări cron acceptă următoarele macro-uri non-standard:

Intrare Descriere Echivalentă cu
@yearly (or @annually) Rulați o dată pe an la miezul nopții de 1 ianuarie 0 0 1 1 *
@monthly Aleargă o dată pe lună la miezul nopții din prima zi a lunii 0 0 1 * *
@weekly Aleargă o dată pe săptămână la miezul nopții duminică dimineață 0 0 * * 0
@daily (or @midnight) Aleargă o dată pe zi la miezul nopții 0 0 * * *
@hourly Aleargă o dată pe oră la începutul orei 0 * * * *
@reboot Rulați la pornire N / A

@rebootconfigurează o lucrare pentru a rula o dată când demonul este pornit. Deoarece cron nu este repornit niciodată, acest lucru corespunde în mod tipic mașinii care este pornită. Acest comportament este aplicat în unele variante ale cronului, cum ar fi cel furnizat în Debian , astfel încât simpla repornire a demonului nu reexecută @rebootjoburile.

@rebootpoate fi util dacă este nevoie să porniți un server sau un daemon sub un anumit utilizator, iar utilizatorul nu are acces la configurarea init pentru a porni programul.

Permisiuni cron

Aceste două fișiere joacă un rol important:

  • /etc/cron.allow - Dacă acest fișier există, acesta trebuie să conțină numele utilizatorului pentru ca acel utilizator să poată utiliza joburile cron.
  • /etc/cron.deny - Dacă fișierul cron.allow nu există, dar fișierul /etc/cron.deny există atunci, pentru a utiliza joburile cron, utilizatorii nu trebuie să fie incluși în fișierul /etc/cron.deny.

Rețineți că, dacă niciunul dintre aceste fișiere nu există, în funcție de parametrii de configurare dependenți de site, fie numai super-utilizatorul poate folosi joburi cron, fie toți utilizatorii pot folosi joburi cron.

Manipularea fusului orar

Majoritatea implementărilor cron interpretează pur și simplu intrările crontab în setarea fusului orar al sistemului în care rulează demonul cron. Aceasta poate fi o sursă de dispută dacă o mașină multi-utilizator mare are utilizatori în mai multe fusuri orare, mai ales dacă fusul orar implicit al sistemului include DST potențial confuz . Astfel, o implementare cron poate, ca un caz special, să recunoască liniile de forma "CRON_TZ = <fus orar>" în crontabs ale utilizatorului, interpretând intrările crontab ulterioare relative la fusul orar respectiv.

Istorie

Versiunile timpurii

Cronul din Versiunea 7 Unix a fost un serviciu de sistem (denumit ulterior un daemon ) invocat de /etc/rccând sistemul de operare a intrat în modul multi-utilizator. Algoritmul său a fost simplu:

  1. Citit /usr/lib/crontab
  2. Determinați dacă orice comandă trebuie să ruleze la data și ora curente și, dacă da, rulați-le ca superutilizator , root.
  3. Dormi un minut
  4. Repetați de la pasul 1.

Această versiune de cron a fost de bază și robustă, dar a consumat și resurse, indiferent dacă a găsit sau nu de lucru. Într-un experiment efectuat la Universitatea Purdue la sfârșitul anilor 1970, pentru a extinde serviciul cron la toți cei 100 de utilizatori pe un VAX partajat în timp , s-a constatat că punea prea multă sarcină pe sistem.

Capacitate multi-utilizator

Următoarea versiune a cronului, odată cu lansarea Unix System V , a fost creată pentru a extinde capacitățile cronului la toți utilizatorii unui sistem Unix, nu doar la superutilizator. Deși acest lucru poate părea trivial astăzi, majoritatea sistemelor Unix și similare Unix având procesoare puternice și un număr redus de utilizatori, la momentul respectiv era nevoie de o nouă abordare pentru un sistem MIPS cu aproximativ 100 de conturi de utilizator.

În ediția din august 1977 a Comunicărilor ACM , WR Franta și Kurt Maly au publicat un articol intitulat „O structură de date eficientă pentru setul de evenimente de simulare”, care descrie o structură de date a cozii de evenimente pentru sisteme de simulare discrete, care demonstrează „ performanță superioară celei utilizate în mod obișnuit algoritmi de listă simplă legată ", comportament bun având în vedere distribuții de timp neuniforme și complexitatea în cel mai rău caz ," n "fiind numărul de evenimente din coadă.

Un student absolvent de la Purdue, Robert Brown, care a analizat acest articol, a recunoscut paralela dintre cron și simulatoare de evenimente discrete și a creat o implementare a managerului de listă de evenimente Franta-Maly (ELM) pentru experimentare. Simulatoarele de evenimente discrete rulează în timp virtual , eliminând evenimentele de pe coada evenimentului cât mai repede posibil și avansând noțiunea lor de „acum” la ora programată a evenimentului următor. Rularea simulatorului de evenimente în „timp real” în loc de timp virtual a creat o versiune de cron care își petrecea cea mai mare parte a timpului dormind, așteptând ora programată pentru a executa sarcina în capul listei de evenimente.

Anul școlar următor a adus noi studenți în programul postuniversitar de la Purdue, inclusiv Keith Williamson, care s-a alăturat personalului sistemelor din departamentul de Informatică. Ca o „sarcină de încălzire”, Brown i-a cerut să descopere prototipul cron într-un serviciu de producție, iar acest cron multi-utilizator a intrat în uz la Purdue la sfârșitul anului 1979. Această versiune a cron a înlocuit în totalitate cea /etc/cronfolosită pe computer. VAX 11/780 al departamentului științific care rulează 32 / V.

Algoritmul folosit de acest cron este după cum urmează:

  1. La pornire, căutați un fișier numit .crontabîn directoarele de start ale tuturor deținătorilor de cont.
  2. Pentru fiecare fișier crontab găsit, determinați data viitoare în care fiecare comandă trebuie să ruleze.
  3. Plasați acele comenzi pe lista de evenimente Franta – Maly cu timpul lor corespunzător și cu specificatorul de timp „cinci câmpuri”.
  4. Introduceți bucla principală:
    1. Examinați intrarea activității din capul cozii, calculați cât de departe în viitor trebuie să ruleze.
    2. Dormi pentru acea perioadă de timp.
    3. La trezire și după verificarea orei corecte, executați sarcina în capul cozii (în fundal) cu privilegiile utilizatorului care a creat-o.
    4. Determinați data viitoare în viitor pentru a rula această comandă și plasați-o din nou pe lista de evenimente la valoarea respectivă.

În plus, daemonul răspunde la semnalele SIGHUP pentru rescanarea fișierelor crontab modificate și programează „evenimente de trezire” speciale în oră și jumătate de oră pentru a căuta fișiere crontab modificate. Aici sunt omise multe detalii cu privire la inexactitățile urmăririi computerului la zi, a programării alarmei Unix, a modificărilor explicite la ora din zi și a gestionării proceselor, toate acestea reprezentând majoritatea liniilor de cod din acest cron. Acest cron a captat și ieșirea stdout și stderr și a trimis prin e-mail orice ieșire proprietarului crontab.

Resursele consumate de această scară cron numai cu cantitatea de muncă pe care o acordă și nu cresc în mod inerent în timp, cu excepția verificării periodice a modificărilor.

Williamson și-a finalizat studiile și a plecat de la universitate cu un masterat în informatică și s-a alăturat AT&T Bell Labs din Murray Hill, New Jersey, și l-a luat cu el pe acest cron. La Bell Labs, el și alții au încorporat comanda Unixat în cron, au mutat fișierele crontab din directoarele de start ale utilizatorilor (care nu erau specifice gazdei) și într-un director comun spool specific gazdei și, în mod necesar, a adăugat crontabcomanda pentru a permite utilizatorii să își copieze crontabs-urile în acel director spool.

Această versiune a cronului a apărut ulterior neschimbată în Unix System V și în BSD și derivatele acestora, Solaris de la Sun Microsystems , IRIX de la Silicon Graphics , HP-UX de la Hewlett-Packard și AIX de la IBM . Din punct de vedere tehnic, licența inițială pentru aceste implementări ar trebui să aparțină Fundației de Cercetare Purdue, care a finanțat lucrarea, dar acest lucru a avut loc într-un moment în care s-a acordat puțină îngrijorare acestor probleme.

Versiuni moderne

Odată cu apariția proiectului GNU și Linux , au apărut noi crons. Cel mai răspândit dintre acestea este Vixie cron, codificat inițial de Paul Vixie în 1987. Versiunea 3 a Vixie cron a fost lansată la sfârșitul anului 1993. Versiunea 4.1 a fost redenumită în ISC Cron și a fost lansată în ianuarie 2004. Versiunea 3, cu unele corecții minore de erori , este utilizat în majoritatea distribuțiilor de Linux și BSD.

În 2007, Red Hat a furnizat vixie -cron 4.1 pentru proiectul cronie și a inclus anacron 2.3 în 2009.

Alte implementări populare includ anacron și dcron. Cu toate acestea, anacron nu este un program cron independent. Un alt job cron trebuie să-l numească. dcron a fost realizat de către fondatorul DragonFly BSD , Matt Dillon , iar întreținerea sa a fost preluată de Jim Pryor în 2010.

În 2003, Dale Mellor a introdus mcron, o variantă cron scrisă în Guile, care oferă compatibilitate încrucișată cu Vixie cron, oferind în același timp o mai mare flexibilitate, deoarece permite utilizarea codului de schemă arbitrară în planificarea calculelor și a definițiilor joburilor. Deoarece atât demonul mcron, cât și fișierele crontab sunt de obicei scrise în schemă (deși mcron acceptă și crontabs tradiționale Vixie), starea cumulativă a cozii de job a unui utilizator este disponibilă pentru codul lor de job, care poate fi programat să ruleze dacă rezultatele altor locurile de muncă îndeplinesc anumite criterii. Mcron este implementat în mod implicit sub Guix managerul de pachete, care include prevederi ( servicii ) pentru managerul de pachete pentru monadic EMIT mcron crontabs în timp ce atât asigurarea faptului că pachetele necesare pentru executarea de locuri de muncă sunt instalate și că crontabs corespunzătoare se referă în mod corect pentru a le.

O soluție webcron programează sarcini de inel pentru a rula în mod regulat oriunde implementările cron nu sunt disponibile într-un mediu de găzduire web .

Expresia CRON

O expresie CRON este un șir care cuprinde cinci sau șase câmpuri separate prin spațiu alb care reprezintă un set de ori, în mod normal ca un program pentru a executa o rutină.

Comentariile încep cu un semn de comentariu # și trebuie să fie pe o linie singure.

Camp Necesar Valori permise Caracterele speciale permise Observații
Minute da 0–59 * , -
Ore da 0–23 * , -
Ziua lunii da 1–31 * , - ? L W ? L W numai în unele implementări
Lună da 1-12 sau IAN-DEC * , -
Zi a săptămânii da 0–6 sau SUN – SAT * , - ? L # ? L # numai în unele implementări
An Nu 1970–2099 * , - Acest câmp nu este acceptat în implementările standard / implicite.

Abrevierile de lună și de săptămână nu sunt sensibile la majuscule și minuscule.

În cazul particular al fișierului crontab al sistemului (/ etc / crontab), un câmp de utilizator se inserează în fața comenzii . În general, este setat la „rădăcină”.

În unele utilizări ale formatului CRON există, de asemenea, un câmp de secunde la începutul modelului. În acest caz, expresia CRON este un șir care cuprinde 6 sau 7 câmpuri.

Virgulă ( ,)
Virgulele sunt folosite pentru a separa elementele dintr-o listă. De exemplu, folosirea „MON, WED, FRI” în câmpul 5 (ziua săptămânii) înseamnă luni, miercuri și vineri.
Dash ( -)
Dash definește intervalele. De exemplu, 2000-2010 indică în fiecare an între 2000 și 2010, inclusiv.
Procent ( %)
Semnele procentuale (%) din comandă, cu excepția cazului în care au scăpat cu bară inversă (\), sunt schimbate în caractere de linie nouă, iar toate datele după primul% sunt trimise la comandă ca intrare standard.

Caracterele non-standard

Următoarele sunt caractere non-standard și există doar în unele implementări cron, cum ar fi programatorul Quartz Java .

L
„L” înseamnă „ultimul”. Când este utilizat în câmpul din ziua săptămânii, permite specificarea unor constructe precum „ultima vineri” („ 5L ”) dintr-o lună dată. În câmpul de zi al lunii, specifică ultima zi a lunii.
W
Caracterul „W” este permis pentru câmpul din ziua lunii. Acest caracter este utilizat pentru a specifica ziua săptămânii (luni-vineri) cea mai apropiată de ziua dată. De exemplu, dacă „ 15W ” este specificat ca valoare pentru câmpul din ziua lunii, semnificația este: „cea mai apropiată zi lucrătoare până la 15 a lunii”. Deci, dacă ziua 15 este sâmbătă, declanșatorul se declanșează vineri 14. Dacă ziua 15 este duminică, declanșatorul se declanșează luni 16. Dacă ziua 15 este marți, atunci se declanșează marți 15. Cu toate acestea, dacă „1W” este specificat ca valoare pentru ziua din lună, iar prima este sâmbătă, declanșatorul se declanșează luni, 3, deoarece nu „sare” peste limita zilelor unei luni. Caracterul „W” poate fi specificat numai atunci când ziua din lună este o singură zi, nu un interval sau o listă de zile.
Hash ( #)
„#” este permis pentru câmpul din ziua săptămânii și trebuie să fie urmat de un număr între unu și cinci. Permite specificarea unor constructe precum „a doua vineri” a unei luni date. De exemplu, introducerea „5 # 3” în câmpul din ziua săptămânii corespunde celei de-a treia vineri a fiecărei luni.
Semn de întrebare ( ?)
În unele implementări, utilizat în loc de „ * ” pentru a lăsa necompletat fie ziua din lună, fie ziua din săptămână. Alte implementări cron înlocuiesc „?” cu ora de pornire a demonului cron, astfel încât acesta ? ? * * * *să fie actualizat la 25 8 * * * *dacă cron pornea la 8:25 dimineața și ar rula la acest moment în fiecare zi până la repornirea din nou.
Slash ( /)
În vixie-cron, oblele pot fi combinate cu intervale pentru a specifica valorile pasului. De exemplu, * / 5 în câmpul de minute indică la fiecare 5 minute (a se vedea nota de mai jos despre frecvențe). Este o prescurtare pentru forma POSIX mai detaliată 5,10,15,20,25,30,35,40,45,50,55,00 . POSIX nu definește o utilizare pentru barele oblice; rațiunea sa (comentarea unei extensii BSD) notează că definiția se bazează pe formatul sistemului V, dar nu exclude posibilitatea extensiilor.

Rețineți că frecvențele în general nu pot fi exprimate; doar valorile pasului care își împart în mod egal intervalul exprimă frecvențe precise (pentru minute și secunde, adică / 2, / 3, / 4, / 5, / 6, / 10, / 12, / 15, / 20 și / 30 deoarece 60 este divizibil în mod egal cu aceste numere; pentru ore, acesta este / 2, / 3, / 4, / 6, / 8 și / 12 ); toți ceilalți „pași” posibili și toate celelalte câmpuri produc perioade „scurte” inconsistente la sfârșitul unității de timp înainte ca aceasta „să se reseteze” la următorul minut, secundă sau zi; de exemplu, introducerea * / 5 pentru câmpul de zi se execută uneori după 1, 2 sau 3 zile, în funcție de lună și anul bisect; acest lucru se datorează faptului că cron este apatrid (nu-și amintește timpul ultimei execuții și nici nu ia în calcul diferența dintre acesta și acum, necesar pentru numărarea precisă a frecvenței - în schimb, cron este un simplu model de potrivire).

H
„H” este utilizat în sistemul de integrare continuă Jenkins pentru a indica faptul că o valoare „hash” este substituită. Astfel, în loc de un număr fix cum ar fi „ 20 * * * *care înseamnă la 20 de minute după oră în fiecare oră” H * * * *, indică faptul că sarcina este efectuată în fiecare oră la un timp nespecificat, dar invariant pentru fiecare sarcină. Acest lucru permite răspândirea sarcinilor în timp, mai degrabă decât ca toate să înceapă în același timp și să concureze pentru resurse.

Vezi si

Referințe

linkuri externe