CRONTAB(5)

NUME
crontab - tabele pentru coordonarea cron

DESCRIERE

Un fișier crontab conține instrucțiuni pentru demonul cron(8) de forma generală: „execută această comandă la această oră la această dată”. Fiecare utilizator are propriul său fișier crontab, iar comenzile din orice fișier crontab dat vor fi executate ca utilizatorul care deține fișierul crontab. Uucp și News vor avea de obicei propriile fișiere crontab, eliminând necesitatea de a executa în mod explicit su(1) ca parte a unei comenzi cron.

Rețineți că comentariile pe aceeași linie cu comenzile cron nu sunt interpretate ca fiind comentarii în accepția cron, ci sunt considerate parte a comenzii și transmise către shell. Acest lucru este valabil și pentru comentariile de pe aceeași linie cu valorile variabilelor de mediu.

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

    nume = valoare

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

Șirul valoare nu este analizat pentru substituții de mediu sau înlocuirea variabilelor sau expansiunea tildei (~), astfel încât linii precum

    PATH=$HOME/bin:$PATH
    PATH=~/bin:/usr/bin

nu vor funcționa așa cum v-ați aștepta. Și nici acest lucru nu va funcționa.

    A=1
    B=2
    C=$A $B

Nu va exista nicio substituție pentru variabilele definite în ultima valoare. Cu toate acestea, cu cele mai multe shell-uri puteți încerca, de asemenea, de exemplu:

    P=PATH=/a/b/c:$PATH
    33 22 1 2 3 eval $P && vreo comandă/comenzi

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ă.

(O altă notă: variabila LOGNAME este numită uneori USER pe sistemele BSD... pe aceste sisteme, USER va fi definită de asemenea.)

În plus față de LOGNAME, HOME, și SHELL, cron(8) se va uita la MAILTO dacă are vreun motiv să trimită mesaje ca urmare a executării comenzilor din „acest” fișier crontab. Dacă MAILTO este definită (și nu este goală), mesajul este trimis utilizatorului numit astfel. Dacă MAILTO este definită, dar este goală (MAILTO=„”), nu va fi trimis niciun mesaj. În caz contrar, mesajul este trimis către proprietarul fișierului crontab. Această opțiune este utilă dacă decideți să folosiți „/bin/mail” în loc de „/usr/lib/sendmail” ca agent de poștă electronică atunci când instalați cron -- „/bin/mail” nu oferp suport pentru nume-alias, iar UUCP de obicei nu citește corespondența acestuia.

Formatul unei comenzi cron este foarte apropiat de standardul V7, cu o serie de extensii compatibile cu versiunile ulterioare. Fiecare linie are cinci câmpuri de oră și dată, urmate de o comandă, urmată de un caracter de linie nouă ('\n'). Fișierul crontab de sistem (/etc/crontab) utilizează același format, cu excepția faptului că numele de utilizator pentru comandă este specificat după câmpurile de oră și dată și înainte de comandă. Câmpurile pot fi separate prin spații sau tabulatoare. Lungimea maximă permisă pentru câmpul comenzii este de 998 de caractere.

Comenzile sunt executate de cron(8) atunci când câmpurile minut, oră și lună a anului corespund orei curente și atunci când cel puțin unul dintre cele două câmpuri ale zilei (ziua din lună sau ziua din săptămână) corespunde orei curente (a se vedea „Nota” de mai jos). cron(8) examinează intrările cron o dată la fiecare minut. Câmpurile de oră și dată sunt:
câmp | valori permise
minut | 0-59
oră | 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. în eng.)

Un câmp poate fi un asterisc (*), care reprezintă întotdeauna „primul-ultimul”.

Intervalele de numere sunt permise. Intervalele sunt 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.

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”). Pașii sunt, de asemenea, permiși după un asterisc, deci dacă doriți să spuneți „la fiecare două ore”, folosiți „*/2”.

Numele pot fi, de asemenea, utilizate pentru câmpurile „luna” și „ziua din săptămână”. Utilizați primele trei litere ale numelui zilei sau lunii respective (numele sunt în limba engleză; nu contează minuscule/majuscule). Exemple pentru lună sunt: “Jan-Mar” sau “Jan,Mar” . Exemple pentru ziua săptămânii sunt: “Mon-Wed” sau “Mon-Wed”.

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 /usr/bin/sh sau de shell-ul specificat în variabila SHELL din fișierul «cron». Semnele de procent (%) din comandă, cu excepția cazului în care sunt eludate cu o bară oblică inversă (\), vor fi transformate î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ă prin două câmpuri — ziua din lună și ziua din săptămână. Dacă ambele câmpuri sunt restricționate (adică nu sunt *), 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. Cu toate acestea, se poate obține rezultatul dorit prin adăugarea unui test la comandă (a se vedea ultimul exemplu în EXEMPLUL DE FIȘIER CRON de mai jos).

Instead of the first five fields, one of eight special strings may appear:
șir | semnificație
@reboot | Rulează o dată, la pornire.
@yearly | Rulează o dată pe an, „0 0 1 1 *”.
@annually | (la fel ca @yearly)
@monthly | Rulează o dată pe lună, „0 0 1 * *”.
@weekly | Rulează o dată pe săptămână, „0 0 * * 0”.
@daily | Rulează o dată pe zi, „0 0 * * * *”.
@midnight | (la fel ca @daily)
@hourly | Se execută o dată pe oră, „0 * * * *”.

Vă rugăm să rețineți că pornirea, în ceea ce privește @reboot, este momentul în care demonul cron(8) pornește. În special, poate fi înainte ca unii demoni de sistem, sau alte facilități, să fi fost porniți. Acest lucru se datorează secvenței ordinii de pornire a mașinii.

EXEMPLU DE FIȘIER CRON

    # utilizează /usr/bin/sh pentru a rula comenzi, indiferent de ceea ce spune /etc/passwd
    SHELL=/usr/bin/sh
    # trimite orice ieșire către „paul”, indiferent al cui fișier crontab este acesta
    MAILTO=paul
    #
    # 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ă"
    0 */4 1 * mon   echo "rulează la fiecare 4 ore pe data de 1 a lunii și în fiecare zi de luni"
    0 0 */2 * sun   echo "rulează la miezul nopții în fiecare duminică care este o dată impară"
    # Rulează în fiecare a doua sâmbătă a lunii
    0 4 8-14 * *    test $(date +\%u) -eq 6 && echo "A doua sâmbătă"
    # Același lucru, la fel de eficient:
    0 4 * * * Sat   d=$(date +e) && test $d -ge 8 -a $d -le 14 && echo "A doua sâmbătă"
    #Se execută devreme în dimineața următoare primei
    #joi a fiecărei luni
    57 2 * * 5 case $(date +d) in 0[2-8]) echo "După prima zi de joi"; esac

Toate exemplele de mai sus rulează programe non-interactive. Dacă doriți să rulați un program care interacționează cu mediul grafic de birou al utilizatorului, trebuie să vă asigurați că variabila de mediu DISPLAY este definită corect.

    # Execută un program și rulează o notificare în fiecare zi la ora 10:00 am
    0 10 * * *  $HOME/bin/program | DISPLAY=:0 notify-send "Se execută programul" "$(cat)"

EXEMPLU DE FIȘIER CRON DE SISTEM

Următoarele prezintă conținutul unui fișier crontab obișnuit la nivel de sistem. Spre deosebire de fișierul crontab al unui utilizator, acest fișier are câmpul „numele utilizatorului”, ca cel utilizat de /etc/crontab.

    # /etc/crontab: system-wide crontab
    # Spre deosebire de orice alt fișier crontab, nu trebuie să executați comanda
    # «crontab» pentru a instala noua versiune atunci când editați acest fișier și
    # fișierele din „/etc/cron.d”. Aceste fișiere au, de asemenea, câmpuri de nume
    # de utilizator, pe care niciunul dintre celelalte fișiere crontab nu le au.

    SHELL=/bin/sh
    PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

    # Exemplu de definire a sarcinii:
    # .---------------- minute (0 - 59)
    # |  .------------- ora    (0 - 23)
    # |  |  .---------- ziua din lună (1 - 31)
    # |  |  |  .------- luna (1 - 12) SAU jan,feb,mar,apr ...
    # |  |  |  |  .---- ziua din săptămână (0 - 6) (Duminică=0 sau 7) SAU sun,mon,tue,wed,thu,fri,sat
    # m h zdl lun zds comandă-dorită-utilizator
    17 * * * *  root  cd / && run-parts --report /etc/cron.hourly
    25 6 * * *  root  test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
    47 6 * * 7  root  test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
    52 6 1 * *  root  test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
    #

Rețineți că toate sarcinile la nivel de sistem vor fi executate, în mod implicit, de la 6 dimineața la 7 dimineața. În cazul sistemelor care nu sunt pornite în această perioadă de timp, vor fi executate doar sarcinile orare, cu excepția cazului în care se modifică valorile implicite de mai sus.

ÎNCĂ UN EXEMPLU

În acest exemplu se poate vedea că numerele pot fi precedate de 0, pentru a alinia coloanele.

    17  * * * *  root  cd / && run-parts --report /etc/cron.hourly
    25 16 * * *  root  test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
    47 06 * * 7  root  test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
    52 06 1 * *  root  test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

CONSULTAȚI ȘI

cron(8), crontab(1)

EXTENSII

Atunci când se specifică ziua săptămânii, atât ziua 0, cât și ziua 7 vor fi considerate duminică. BSD și AT&T par să nu fie de acord cu privire la acest lucru.

Listele și intervalele pot coexista în același câmp. „1-3,7-9” ar fi respins de AT&T sau BSD cron -- acestea vor să vadă DOAR „1-3” sau „7,8,9”.

Intervalele pot include „trepte”, astfel încât „1-9/2” este același lucru cu „1,3,5,7,9”..

Numele lunilor sau ale zilelor săptămânii pot fi specificate prin nume..

Variabilele de mediu pot fi definite în crontab.. În BSD sau AT&T, mediul transmis proceselor-copil este practic cel din „/etc/rc”..

Comanda de ieșire este trimisă prin poștă proprietarului fișierului crontab (BSD nu poate face acest lucru), poate fi trimisă prin poștă unei alte persoane decât proprietarul fișierului crontab (SysV nu poate face acest lucru) sau funcția poate fi dezactivată și nu va fi trimis niciun mesaj (SysV nu poate face nici acest lucru).

Toate comenzile „@”care pot apărea în locul primelor cinci câmpuri sunt extensii.

LIMITĂRI

Demonul cron rulează cu un fus orar definit. În prezent, acesta nu acceptă fusele orare pe utilizator. Toate sarcinile: ale sistemului și ale utilizatorului vor fi executate pe baza fusului orar configurat. Chiar dacă un utilizator specifică variabila de mediu TZ în crontab, aceasta va afecta doar comenzile executate în crontab, nu și executarea sarcinilor crontab în sine. Dacă se dorește specificarea unui anumit fus orar pentru sarcinile crontab, se poate verifica data în scriptul-copil, de exemplu:

    # m h  zdl luna zds   comanda

    TZ=UTC
    0 * * * * [ "$(date +\%R)" = 00:00 ] && rulează_vreun_script

POSIX specifică faptul că câmpurile „ziua din lună” și „ziua din săptămână” trebuie să corespundă cu ora curentă dacă oricare dintre ele este un *. Cu toate acestea, această implementare verifică numai dacă primul caracter este un *. Acesta este motivul pentru care „0 0 */2 * sun” rulează în fiecare duminică și la o dată impară, în timp ce standardul POSIX ar trebui să ruleze în fiecare duminică și la fiecare dată impară.

Sintaxa crontab nu face posibilă definirea tuturor perioadelor posibile pe care le putem imagina. De exemplu, nu este simplu să se definească ultima zi lucrătoare a unei luni. Pentru ca o sarcină să fie executată într-o perioadă de timp care nu poate fi definită folosind sintaxa crontab, cea mai bună abordare ar fi ca programul însuși să verifice informațiile privind data și ora și să continue execuția numai dacă perioada corespunde celei dorite.

În cazul în care programul în sine nu poate efectua verificările, atunci ar fi necesar un script ajutător&. Instrumentele utile care ar putea fi utilizate pentru analizarea datelor sunt ncal(1) sau calendar(1). De exemplu, pentru a rula un program în ultima sâmbătă a fiecărei luni, ați putea utiliza următorul cod de script-ajutător:

    0 4 * * Sat   [ "$(date +\%e)" = "$(LANG=C ncal | sed -n 's/^Sa .* \([0-9]\+\) *$/\1/p')" ] && echo "Ultima sâmbătă" && programul_de_executat

Lungimea maximă permisă pentru câmpul de comandă este de 998 de caractere.

Lungimea recomandată ar trebui să fie mai mică de 80 de caractere, la fel ca rândurile din fișierele sursă ușor de citit. Atunci când este necesar să se utilizeze o comandă lungă, merită să se creeze un script dedicat, care, la rândul său, poate conține comentarii utile.

UTILIZAREA EVAL PENTRU A INCLUDE DIVERSE OPȚIUNI DE MEDIU

Următorul sfat este oferit cu amabilitate de 積丹尼 Dan Jacobson:

    CONTENT_TYPE="text/plain; charset=UTF-8"
    d=eval LANG=zh_TW.UTF-8 w3m -dump
    26 22 16 1-12 * $d https://www.ptt.cc/bbs/transgender/index.html

nu va funcționa fără eval. Spunând

    d=LANG=zh_TW.UTF-8 w3m -dump

se va obține

    /bin/sh: LANG=zh_TW.UTF-8: command not found (comanda nu a fost găsită)

DIAGNOSTICARE

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.

AUTORI

Paul Vixie <paul@vix.com>
    A scris această pagină de manual (1994).

Steve Greenland <stevegr@debian.org>
    A întreținut pachetul (1996-2005)

Javier Fernández-Sanguino Peña <jfs@debian.org>
    A întreținut pachetul (2005-2014).

Christian Kastner <ckk@debian.org>
    A întreținut pachetul (2010-2016).

Georges Khaznadar <georgesk@debian.org>
    A întreținut pachetul (2022-2024).

DREPTURI DE AUTOR
Drepturi de autor © 1994 Paul Vixie

Distribuiți liber, cu următoarele excepții: nu-mi scoateți numele din sursă sau din documentație (nu-mi luați creditul pentru munca mea), marcați-vă modificările (nu mă faceți să fiu învinovățit pentru eventualele erori), nu modificați sau eliminați această notificare. Poate fi vândut dacă sursa construibilă este furnizată cumpărătorului. Nici o garanție de orice fel, expresă sau implicită, nu este inclusă cu acest software; utilizați-l pe propriul risc, responsabilitatea pentru daunele (dacă există) aduse cuiva ca urmare a utilizării acestui software revine în întregime utilizatorului.

Începând cu anul 1994, multe modificări au fost făcute în această pagină de manual, scrisă de dezvoltatorii Debian care au întreținut cron(TM); mai sus este o listă scurtă, mai multe informații pot fi găsite în fișierul /usr/share/doc/cron/copyright.

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.