CRONTAB(5)

NUME
crontab - fișiere utilizate pentru programarea execuției programelor

DESCRIERE
Un fișier crontab conține instrucțiuni pentru demonul cron(8) în următoarea manieră simplificată: „execută această comandă la această oră la această dată”. Fiecare utilizator își poate defini propriul fișier crontab. Comenzile definite în orice fișier crontab dat sunt executate de către utilizatorul care deține fișierul crontab respectiv. Uucp și News au de obicei propriile fișiere crontab, eliminând necesitatea de a executa în mod explicit su(1) ca parte a unei comenzi «cron».

Liniile goale, spațiile inițiale și tabulatoarele sunt ignorate. Liniile al căror prim caracter care nu este spațiu alb este semnul lirei (#) sunt comentarii și nu sunt procesate. Rețineți că comentariile nu sunt permise pe aceeași linie cu comenzile cron, deoarece sunt considerate parte a comenzii. În mod similar, comentariile nu sunt permise pe aceeași linie cu valorile variabilelor de mediu.

O linie activă într-un crontab este fie o opțiune de mediu, fie o comandă cron. O opțiune de mediu este de forma:

   nume = valoare

unde spațiile albe din jurul semnului egal (=) sunt opționale, iar orice spații albe ulterioare care nu precedă valoarea fac parte din valoarea atribuită lui nume. Șirul valoare poate fi plasat între ghilimele (simple sau duble, dar identice) pentru a păstra spațiile albe anterioare sau posterioare.

Mai multe variabile de mediu sunt configurate automat de către demonul cron(8). Variabila SHELL este definită la „/bin/sh”, iar variabilele LOGNAME și HOME sunt definite din linia „/etc/passwd” a proprietarului fișierului crontab. Variabilele HOME și SHELL pot fi înlocuite de configurările din crontab; variabila LOGNAME nu poate fi înlocuită.

(Notă: variabila LOGNAME este uneori numită USER pe sistemele BSD și este, de asemenea, definită automat).

În plus față de LOGNAME, HOME și SHELL, cron(8) analizează variabila MAILTO dacă trebuie trimis un mesaj ca urmare a executării oricărei comenzi din fișierul crontab respectiv. Dacă variabila MAILTO este definită (și nu este goală), mesajul este trimis la adresa specificată. Dacă MAILTO este definită, dar goală (MAILTO=„”), nu se trimite niciun mesaj. În caz contrar, mesajul este trimis către proprietarul fișierului crontab. Această opțiune este utilă dacă decideți să utilizați „/bin/mail” în loc de „/usr/lib/sendmail” ca agent de poștă electronică. Rețineți că „/bin/mail” nu oferă suport pentru crearea de nume-alias și UUCP nu citește de obicei corespondența sa. Dacă MAILFROM este definită (și nu este goală), aceasta este utilizată ca adresă a expeditorului plicului, în caz contrar, este utilizat numele de utilizator al utilizatorului care execută. Această variabilă este moștenită și din mediul procesului crond.

Notă: Atât variabilele MAILFROM, cât și MAILTO sunt expandate, astfel încât definirea lor ca în exemplul următor funcționează conform așteptărilor: MAILFROM=cron-$USER@cron.com ($USER este înlocuit cu utilizatorul de sistem)

În mod implicit, cron trimite un mesaj folosind antetul „Content-Type:” „text/plain” cu parametrul „charset=” definit la codificarea „charmap/codeset” a configurației regionale în care crond(8) este pornit, adică fie configurația regională implicită a sistemului, dacă nu sunt definite variabilele de mediu LC_*, fie configurația regională specificată de variabilele de mediu LC_* (a se vedea locale(7)). Diferite codificări de caractere pot fi utilizate pentru trimiterea prin poșta electronică a rezultatelor sarcinilor cron prin definirea variabilelor CONTENT_TYPE și CONTENT_TRANSFER_ENCODING într- un fișier crontab la valorile corecte ale antetelor de poștă electronică ale acestor nume.

Variabila CRON_TZ specifică fusul orar specific pentru tabelul cron. Utilizatorul trebuie să introducă în tabel o oră în conformitate cu fusul orar specificat. Ora utilizată pentru scrierea într-un fișier jurnal este preluată din fusul orar local, în care rulează demonul.

Variabila de mediu MLS_LEVEL oferă suport pentru mai multe contexte de securitate SELinux per-sarcină în același fișier crontab. În mod implicit, sarcinile cron se execută cu contextul de securitate SELinux implicit al utilizatorului care a creat fișierul crontab. Atunci când se utilizează mai multe niveluri de securitate și roluri, acest lucru poate să nu fie suficient, deoarece același utilizator poate rula în roluri diferite sau în niveluri de securitate diferite. Pentru mai multe informații despre roluri și SELinux MLS/MCS, consultați selinux(8) și exemplul de fișier crontab menționat mai departe în acest text. Puteți defini variabila MLS_LEVEL la șirul contextului de securitate SELinux, specificând contextul de securitate SELinux particular în care doriți ca sarcinile să fie executate. crond va stabili apoi contextul de execuție al acelor lucrări care îndeplinesc specificațiile contextului de securitate particular. Pentru mai multe informații, consultați opțiunea «crontab(1) -s».

Variabila RANDOM_DELAY permite întârzierea lansării sarcinilor cu un număr aleatoriu de minute, cu limita superioară specificată de variabilă. Factorul de scalare aleatoriu este determinat în timpul pornirii demonului cron, astfel încât rămâne constant pe întreaga durată de funcționare a demonului.

Formatul unei comenzi cron este similar cu standardul V7, cu o serie de extensii compatibile cu versiunile ulterioare.. Fiecare linie are cinci câmpuri de oră și dată, urmate de un nume de utilizator (dacă acesta este fișierul crontab al sistemului) și urmate de o comandă. Comenzile sunt executate de cron(8) atunci când câmpurile „minute”, „ora” și „luna din an” corespund orei curente, și cel puțin unul dintre cele două câmpuri „ziua” („ziua din lună” sau „ziua din săptămână”) corespund orei curente (a se vedea «Nota» de mai jos).

Rețineți că acest lucru înseamnă că orele inexistente, cum ar fi „orele lipsă” din timpul conversiei la ora de vară, nu se vor potrivi niciodată, ceea ce va determina neefectuarea lucrărilor programate în timpul „orelor lipsă”. În mod similar, orele care apar de mai multe ori (din nou, în timpul conversiei la ora de vară) vor determina executarea de două ori a lucrărilor corespondente.

cron(8) examinează intrările cron la fiecare minut.

Câmpurile de oră și dată sunt:

    field    allowed values
    -----    --------------
    minute    0-59
    ora    0-23
    ziua din lună    1-31
    luna    1-12 (sau nume, a se vedea mai jos)
    ziua din săptămână    0-7 (0 sau 7 este duminică, sau folosiți nume)

Un câmp poate conține un asterisc (*), care înseamnă întotdeauna „primul-ultimul”.

Sunt permise intervalele de numere. Intervalele sunt formate din două numere separate cu o cratimă. Intervalul specificat este inclusiv. De exemplu, 8-11 pentru o intrare „ore” specifică executarea la orele 8, 9, 10 și 11. Primul număr trebuie să fie mai mic sau egal cu al doilea.

Se poate utiliza randomizarea timpului de execuție în cadrul unui interval. Se alege un număr aleatoriu într-un interval specificat ca două numere separate prin tildă. Intervalul specificat este inclusiv. De exemplu, 6~15 pentru o intrare „minute” selectează un minut aleatoriu în intervalul 6-15. Numărul aleatoriu este ales atunci când fișierul crontab este analizat. Primul număr trebuie să fie mai mic sau egal cu cel de-al doilea.Puteți omite unul sau ambele numere care specifică intervalul. De exemplu, ~ pentru o intrare „minute” alege un minut aleatoriu în intervalul 0 - 59.

Listele sunt permise. O listă este un set de numere (sau intervale) separate prin virgulă. Exemple: „1,2,5,9”, „0-4,8-12”.

Valorile pas cu pas pot fi utilizate împreună cu intervalele. Urmarea unui interval cu un „/<număr>” specifică salturi ale valorii numărului prin interval. De exemplu, „0-23/2” poate fi utilizat în câmpul „ore” pentru a specifica executarea comenzii la fiecare două ore (alternativa din standardul V7 este „0,2,4,6,8,10,12,14,16,18,20,22”). Valorile pas cu pas sunt, de asemenea, permise după un asterisc, astfel încât, dacă specificați o sarcină care să fie executată la fiecare două ore, puteți utiliza „*/2”. Vă rugăm să rețineți că pașii sunt evaluați doar în cadrul câmpului la care sunt aplicați. De exemplu, „*/23” în câmpul ore înseamnă executarea sarcinii la ora 0 și la ora 23 într-o zi calendaristică. Consultați secțiunea „NOTE” de mai jos pentru o soluție.

Numele pot fi utilizate și pentru câmpurile „luna” și „ziua din săptămână”. Utilizați primele trei litere ale numelui zilei sau lunii respective (în engleză; nu contează minuscule/majusculele). Sunt permise intervalele și listele de nume. Exemple: „mon,wed,fri”, „jan-mar”.

Dacă UID-ul proprietarului este 0 (root), primul caracter al unei intrări crontab poate fi caracterul „-”. Acest lucru va împiedica cron să scrie un mesaj syslog cu privire la comanda care se execută.

Al „șaselea” câmp (restul liniei) specifică comanda care urmează să fie executată. Întreaga porțiune de comandă din linie, până la o linie nouă sau un caracter „%”, va fi executată de „/bin/sh” sau de shell-ul specificat în variabila SHELL din fișierul «cron». Un caracter „%” din comandă, cu excepția cazului în care este eludat cu o bară oblică inversă (\), va fi transformat în caractere de linie nouă, iar toate datele după primul % vor fi trimise la comandă ca intrare standard.

Notă: Ziua de execuție a unei comenzi poate fi specificată în următoarele două câmpuri — „ziua din lună”, și „ziua din săptămână”. Dacă ambele câmpuri sunt restricționate (adică nu conțin caracterul „*”), comanda va fi executată atunci când oricare dintre câmpuri corespunde orei curente. De exemplu,
„30 4 1,15 * 5” ar face ca o comandă să fie executată la ora 4:30 în zilele de 1 și 15 ale fiecărei luni, plus în fiecare vineri.

Sintaxa unui fișier crontab poate fi testată înainte de instalare cu ajutorul opțiunii „-T”. Consultați crontab(1) pentru detalii.

EXEMPLU DE FIȘIER CRON
# utilizează /bin/sh pentru a rula comenzi, indiferent de ceea ce spune /etc/passwd
SHELL=/bin/sh
# trimite orice ieșire către „paul”, indiferent al cui fișier crontab este acesta
MAILTO=paul
#
CRON_TZ=Japan
# rulează în fiecare zi la cinci minute după miezul nopții
5 0 * * *       $HOME/bin/daily.job >> $HOME/tmp/out 2>&1
# rulează la 2:15pm în prima zi a fiecărei luni - ieșirea trimisă la paul
15 14 1 * *     $HOME/bin/monthly
# rulează la ora 10 pm în zilele lucrătoare, enervând-ul pe Joe
0 22 * * 1-5    mail -s "Este ora 10 pm” joe%Joe,%%unde sunt copiii tăi?%
23 0-23/2 * * * echo "rulează 23 de minute după miezul nopții, 2am, 4am ..., în fiecare zi"
5 4 * * sun     echo "rulează la 5 minute după ora 4 în fiecare duminică"

Sarcini în /etc/cron.d/
Sarcinile din cron.d și /etc/crontab sunt sarcini de sistem, care sunt utilizate de obicei pentru mai mulți utilizatori, prin urmare, este necesar în plus numele de utilizator. „MAILTO” de pe prima linie este opțional.

EXEMPLU DE O SARCINĂ ÎN „/etc/cron.d/job”
#autentificați-vă ca root
#creați o sarcină de lucru cu editorul preferat (de exemplu, vim)
MAILTO=root
* * * * * root touch /tmp/fișier

NOTE
După cum s-a menționat mai sus, valorile de salt funcționează numai în cadrul perioadei de timp la care sunt atașate. De exemplu, specificarea „0/35” pentru câmpul minute al unei intrări crontab nu va face ca acea intrare să fie executată la fiecare 35 de minute; în schimb, va fi executată de două ori în fiecare oră, la 0 și 35 de minute. Pentru un control mai fin, puteți face ceva similar cu aceasta:
* * * * * if [ $(expr \( $(date +%s) / 60 \) % 58) = 0 ]; then echo rulează la fiecare 58 de minute; fi
0 * * * * if [ $(expr \( $(date +%s) / 3600 \) % 23) = 0 ]; then echo rulează la fiecare 23 de ore; fi
Ajustați după cum este necesar dacă comanda date(1) nu acceptă „+%s” ca specificator al șirului de format pentru a afișa marcajul de timp UNIX curent.

SELinux cu securitate pe mai multe niveluri (MLS)
Într-un fișier crontab, este important să specificați un nivel de securitate prin crontab -s sau specificând nivelul necesar pe prima linie a fișierului crontab. Fiecare nivel este specificat în /etc/selinux/targeted/seusers. Atunci când utilizați «crontab» în modul MLS, este deosebit de important să:
- verificați/modificați rolul actual,
- definiți corect rolul pentru directorul, care este utilizat pentru intrare/ieșire.

EXEMPLU PENTRU SELINUX MLS
# autentificați-vă ca root
newrole -r sysadm_r
mkdir /tmp/SystemHigh
chcon -l SystemHigh /tmp/SystemHigh
crontab -e
# scrieți în fișierul crontab
MLS_LEVEL=SystemHigh
0-59 * * * * id -Z > /tmp/SystemHigh/crontest

FIȘIERE
/etc/crontab principalul fișier crontab al sistemului. /var/spool/cron/ un director pentru stocarea fișierelor crontab definite de utilizatori. /etc/cron.d/ un director pentru stocarea fișierelor crontab de sistem.

CONSULTAȚI ȘI
cron(8), crontab(1)

EXTENSII
Sunt acceptate aceste „porecle” speciale de specificare a timpului, care înlocuiesc cele 5 câmpuri inițiale de dată și oră și sunt prefixate cu caracterul „@”:

@reboot   :   Se execută o dată după repornire.
@yearly   :   Se execută o dată pe an, adică „0 0 1 1 *”.
@annually :   Se execută o dată pe an, adică „0 0 1 1 *”.
@monthly  :   Se execută o dată pe lună, adică „0 0 1 * *”.
@weekly   :   Se execută o dată pe săptămână, adică „0 0 * * 0”.
@daily    :   Se execută o dată pe zi, adică „0 0 * * *”.
@hourly   :   Se execută o dată pe oră, adică „0 * * * *”.

AVERTISMENTE
Fișierele crontab trebuie să fie fișiere obișnuite sau legături simbolice către fișiere obișnuite, nu trebuie să fie executabile sau cu permisiune de scriere pentru nimeni altcineva decât proprietarul. Această cerință poate fi anulată prin utilizarea opțiunii -p în linia de comandă a crond. Dacă este utilizat suportul inotify, modificările din fișierele crontab cu legături simbolice nu sunt observate automat de către demonul cron. Demonul cron trebuie să primească un semnal SIGHUP pentru a reîncărca fișierele crontab. Aceasta este o limitare a API-ului inotify.

cron cere ca fiecare intrare dintr-un fișier crontab să se încheie cu un caracter de linie nouă. Dacă ultima intrare dintr-un fișier crontab nu conține o linie nouă (adică se termină cu EOF), cron va considera fișierul crontab (cel puțin parțial) corupt. Un avertisment va fi scris în syslog.

AUTOR
Paul Vixie (vixie@isc.org)

TRADUCERE
Traducerea în limba română a acestui manual a fost făcută de Remus-Gabriel Chelu <remusgabriel.chelu@disroot.org>

Această traducere este documentație gratuită; citiți Licența publică generală GNU Versiunea 3 (https://www.gnu.org/licenses/gpl-3.0.html) sau o versiune ulterioară cu privire la condiții privind drepturile de autor. NU se asumă NICIO RESPONSABILITATE.

Dacă găsiți erori în traducerea acestui manual, vă rugăm să trimiteți un e-mail la translation-team-ro@lists.sourceforge.net.