De mai multe ori în tutorialele prezentate pe site am menționat adăugarea unor sarcini cron, fără să ofer prea multe explicații. Dar cum zilele acestea am fost întrebat ce anume reprezintă simbolurile din linia CRON, a venit rândul și unui astfel de articol.
Cron permite utilizatorilor Linux să execute comenzi sau scripturi la anumite momente bine stabilite. Cron este una din cele mai folositoare unelte din Linux. Este folosită, de regulă, de administratorii de sistem pentru backup (am explicat în acest articol cum se face backup automat la un server VPS), pentru curățarea directorului /tmp sau pentru orice alt script considerat util de sysadmin.
Serviciul (daemonul) cron rulează în background și verifică în permanență directoarele /etc/cron.daily, /etc/cron.hourly, /etc/cron.monthly și /etc/cron.weekly pentru a găsi scripturile adăugate acolo (semnificația fiecărui director este de la sine înțeleasă).
Comanda crontab
Vom folosi comanda crontab
pentru a edita lista sarcinilor impuse a fi executate. Pentru a deschide crontab-ul personal (fișierul de configurare cron), se va executa comanda:
crontab -e
În fiecare linie din acest fișier putem defini ce comandă sau script să se execute, la ce interval de timp (din 5 în 5 minute, de 2 ori pe lună, etc.). Structura unei linii este următoarea:
minute oră zi-din-lună lună zi-din-săptămână cale/către/comandă
Unde:
- minute: 0 - 59
- ora: 0 - 23
- ziua-din-lună: 0 - 31
- luna: 1 - 12 (12 == decembrie), sau jan, feb, mar,...
- ziua-din-săptămână: 0 - 6 (0 == duminică), sau sun, mon, tue, wed, thu, fri, sat
- cale/către/comandă: calea către scriptul sau comanda care trebuie să se execute
Fișierul cron al utilizatorilor arată la fel ca cel de sistem (prezentat mai sus, cu deosebirea că linia cron va avea sintaxa:
minute oră zi-din-lună lună zi-din-săptămână NUME_UTILIZATOR cale/către/comandă
Câteva exemple de sarcini cron:
Linia de mai jos execută scriptul backup.sh în fiecare zi a săptămânii la ora 2 dimineața:
0 2 * * * /root/backup.sh
Linia următoare execută o anumită comandă în fiecare zi a săptămânii la 5 minute după miezul nopții:
5 0 * * *cale/către/comandă
Linia următoare se execută în prima zi a fiecărei luni la ora 14:15:
15 14 1 * * cale/către/comandă
Linia de mai jos se execută la ora 22:00 în fiecare zi de luni până vineri
0 22 * * 1-5 cale/către/comandă
Linia următoare se execută în fiecare zi din două în două ore, începând cu ora 0:23, continuând cu 02:23, 04:23, etc.
23 0-23/2 * * * cale/către/comandă
Cum se folosesc operatorii
Un operator permite specificarea a mai multor valori într-un singur câmp. Pentru cron există 4 operatori:
- asteriscul (*): specifică toate valorile posibile pentru un câmp; de exemplu, un * în câmpul oră înseamnă că linia respectivă va fi executată în fiecare oră, un * în câmpul zi a lunii semnifică execuția în fiecare zi;
- virgula (,): acest operator specifică o listă de valori; de exemplu, dacă avem în câmpul zi a lunii 1,5,9,17,23,28, linia respectivă se va executa doar în zilele specificate din fiecare lună;
- liniuța (-): acest operator specifică un interval de valori; de exemplu, putem scrie 1-5 în loc de 1,2,3,4,5
- separatorul slash (/): specifică pasul valorilor respective; de exemplu, cum am avut mai sus 0-23/2, semnifică faptul că linia se va executa din 2 în două ore; tot la fiecare două ore mai poate fi specificat prin */2; la fiecare 20 de minute putem specifica dacă trecem în câmpul minute */20
Pentru a lista toate sarcinile cron:
crontab -l
crontab -u username -l
Pentru a șterge toate sarcinile cron folosim comanda:
# Șterge toate sarcinile cron
crontab -r
# Șterge toate sarcinile cron ale unui utilizator
crontab -r -u username
Folosirea șirurilor speciale
În loc să folosim primele 5 câmpuri (minute, oră, zi-din-lună, lună, zi-din-săptămână), putem să definim sarcini cron folosind unul din următoarele 8 șiruri speciale:
Șir special | Semnificație |
@reboot | rulează o singură dată, la pornirea serverului |
@yearly | rulează o dată pe an; echivalent cu "0 0 1 1 *" |
@annually | la fel cu @yearly |
@monthly | rulează o dată pe lună; echivalent cu "0 0 1 * *" |
@weekly | rulează o dată pe săptămână; echivalent cu "0 0 * * 0" |
@daily | rulează o dată pe zi; echivalent cu "0 0 * * *" |
@midnight | la fel ca @daily |
@hourly | rulează la fiecare oră; echivalent cu "0 * * * * " |
Directoarele cron
Director | Descriere |
/etc/cron.d/ | Puneți scripturile aici și le chemați prin intermediul crontab |
/etc/cron.hourly/ | Rulează toate scripturile de aici o dată pe oră |
/etc/cron.daily/ | Rulează toate scripturile de aici o dată pe zi |
/etc/cron.weekly/ | Rulează toate scripturile de aici o dată pe săptămână |
/etc/cron/monthly/ | Rulează toate scripturile de aici o dată pe lună |
Pentru a intra mai amănunțit în detaliile cron folosiți comanda man 5 crontab
.
remusdirect a zis
Salut, incerc sa realizez o sarcina Cron la fiecare oră pentru a trimite noile anunturi publicate si nu reusesc. Mă poti ajuta? Mersi.
Teec a zis
Foarte bun articolul , foarte bine explicat!
Bobses a zis
Mersi!
Petru a zis
Salutare,
Multumesc pentru prezentarea acestui instrument.
Mi se pare foarte util. 🙂
Numai bine,
Petru
http://www.gulian.ro
Bobses a zis
Salut
Cu plăcere.
Toate cele bune.