Cron & crontab, explicat

Lucaine publicat cu ceva timp in urma excelent tutorial despre cron și crontab asta cred că merită împărtășit. Cron este un fel de echivalent cu sarcinile programate în Windows, doar că este manipulat de la terminal. Cei care preferă o interfață vizuală pentru a atinge același obiectiv, pot vedea acest lucru un alt articol.

Ce este cron?

Numele cron provine din grecescul chronos care înseamnă „timp”. În sistemul de operare Unix, cron este un manager de proces obișnuit (daemon) care rulează procese sau scripturi la intervale regulate (de exemplu, în fiecare minut, zi, săptămână sau lună). Procesele care trebuie executate și ora la care trebuie executate sunt specificate în fișierul crontab.

lucrari COMO

Demonul cron începe de la /etc/rc.d/ o /etc/init.d în funcție de distribuție. Cron rulează în fundal, verifică tabelul de sarcini crontab în fiecare minut / etc / crontab o o / var / spool / cron în căutarea sarcinilor de îndeplinit. Ca utilizator, putem adăuga comenzi sau scripturi cu sarcini pe cron pentru a automatiza unele procese. Acest lucru este util, de exemplu, pentru a automatiza actualizarea unui sistem sau a unui sistem de backup bun.

Articol asociat:
Tutorial: Instalați pachetele .tar.gz și .tar.bz2

Ce este Crontab?

Crontab este un fișier text simplu care stochează o listă de comenzi care trebuie executate la un moment specificat de utilizator. Crontab va verifica data și ora când ar trebui executat scriptul sau comanda, permisiunile de execuție și o va face în fundal. Fiecare utilizator poate avea propriul fișier crontab, de fapt / etc / crontab se presupune că este fișierul crontab al utilizatorului rădăcină, atunci când utilizatorii normali (și chiar rădăcina) doresc să își genereze propriul fișier crontab, atunci vom folosi comanda crontab.

Crontab este cel mai simplu mod de a gestiona sarcinile cron pe sisteme multi-utilizator, fie ca simplu utilizator de sistem, fie ca utilizator root.

Folosind crontab

Începem cu un exemplu simplu.

Vom automatiza actualizarea unui sistem, pentru a elimina enervantul „Trebuie să actualizez întotdeauna și nu-mi place asta!”

Cum să
Articol asociat:
Comenzi pentru cunoașterea sistemului (identificarea hardware-ului și a unor configurații software)

În primul rând vom realiza un scenariu. Acest script va fi apelat de cron și va conține toate instrucțiunile pe care dorim să le facă, de aceea este necesar să îl testăm în mai multe cazuri și în mai multe moduri înainte de a-l include în cron, un script de actualizare simplu ca acesta:

#! / bin / bash # exemplu de actualizare script # alegeți distribuția dvs. # debian-ubuntu # apt-get update & apt-get -y upgrade #fedora #yum -y update #Arch #pacman --noconfirm -Syu

Eliminați # de pe linia dvs. de distribuție. În cazul în care este Ubuntu / Debian, începe cu apt-get.

Salvăm scriptul ca update.sh (de exemplu, directorul de scripturi acasă). Modificăm permisiunile de execuție ale scriptului menționat cu:

chmod a + x ~ / scripts / update.sh

Executăm scriptul de câteva ori pentru a verifica dacă totul funcționează fără probleme, modificăm ceea ce este necesar (nu trebuie să conțină erori, altfel cron va repeta o eroare doar iar și iar). Acum, pentru a adăuga sarcina la crontab-ul nostru.

Adăugați sarcini la crontab

Executăm ediția crontab cu crontab -e, în unele distribuții (cum ar fi Ubuntu) ne oferă opțiunea de a alege editorul de text pe care îl dorim, restul ne-a rămas cu vi. Fișierul crontab va arăta cam așa.

# mh dom mon dow user command

Unde:

  • m corespunde minutului în care va fi executat scriptul, valoarea variază de la 0 la 59
  • h ora exactă, formatul de 24 de ore este gestionat, valorile variază de la 0 la 23, 0 fiind la miezul nopții 12:00.
  • cadou se referă la ziua lunii, de exemplu, puteți specifica 15 dacă doriți să rulați la fiecare 15 zile
  • dow înseamnă ziua săptămânii, poate fi numerică (de la 0 la 7, unde 0 și 7 sunt duminică) sau primele 3 litere ale zilei în limba engleză: lun, mar, wed, joi, vin, sat, soare.
  • utilizator definește utilizatorul care va executa comanda, poate fi root sau un alt utilizator, atâta timp cât au permisiunile de a executa scriptul.
  • comandă se referă la comanda sau calea absolută a scriptului de executat, exemplu: /home/usuario/scripts/update.sh, dacă apelează un script, acesta trebuie să fie executabil

Pentru a fi clar câteva exemple de sarcini cron explicate:

15 10 * * * utilizator /home/usuario/scripts/update.sh

Acesta va rula scriptul update.sh la 10:15 în fiecare zi

15 22 * * * utilizator /home/usuario/scripts/update.sh

Acesta va rula scriptul update.sh la 10:15 în fiecare zi

00 10 * * 0 root apt-get -y update Utilizator rădăcină

Va rula o actualizare în fiecare duminică la 10:00

45 10 * * Sun Root APT -GET -Y UPDATE

Utilizatorul rădăcină va rula o actualizare în fiecare duminică (Duminică) la 10:45 dimineața

30 7 20 11 * user /home/usuario/scripts/update.sh

Pe 20 noiembrie la 7:30 utilizatorul va rula scriptul

30 7 11 11 sun user /home/usuario/scripts/pastel_con_velitas.sh

Pe 11 noiembrie la 7:30 și adică duminică, utilizatorul își va sărbători administratorul (adică eu)

01 * * * * utilizator /home/usuario/scripts/molestorecordatorio.sh

Un memento enervant în fiecare minut din fiecare oră în fiecare zi (NU este recomandat).

Ele pot fi încă manipulate game speciale:

30 17 * * 1,2,3,4,5

La 5:30 după-amiaza în fiecare zi de luni până vineri.

00 12 1,15,28 * *

La 12 am fiecare primă, cincisprezecea și 28 a fiecărei luni (ideal pentru salarizare)

Dacă acest lucru este confuz, mânere crontab șiruri speciale pentru a defini aceste intervale.

@reboot Rulați o dată, la pornire
@yearly rulează doar o dată pe an: 0 0 1 1 *
@anual la fel ca @anual
@lunar rulează o dată pe lună, prima zi: 0 0 1 * *
@weekly Weekly primul minut din prima oră a săptămânii. 0 0 * * 0 ″.
@ zilnic, la 12:00 AM 0 0 * * *
@midnight la fel ca @ zilnic
@hourly în primul minut al fiecărei ore: 0 * * * *

Utilizarea sa este foarte simplă.

@hourly user /home/user/scripts/molestorecordatorio.sh @monthly user /home/user/scripts/backup.sh @daily root apt-get update && apt-get -y upgrade

Ultimul, dar nu cel din urmă:

Managementul locurilor de muncă Cron

fișier crontab

Înlocuiți fișierul crontab existent cu un fișier definit de utilizator

crontab -e

Editați fișierul crontab al utilizatorului, fiecare nouă linie va fi o nouă sarcină crontab.

crontab -l

Enumerați toate sarcinile crontab ale utilizatorului

crontab -d

Ștergeți crontab-ul utilizatorului

crontab -c dir

Definește directorul crontab al utilizatorului (acesta trebuie să aibă permisiunile de scriere și executare ale utilizatorului)

crontab -u utilizator

prefix pentru a gestiona crontabul altui utilizator, exemple:

$ sudo crontab -l -u root $ sudo crontab -e user2 #crontab -d -u user

Acest instrument, ca multe altele, poate fi văzut mai în profunzime și mai detaliat în:

Mulțumesc Lucain!

48 comentarii, lasă-le pe ale tale

Lasă comentariul tău

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *

*

*

  1. Responsabil pentru date: Miguel Ángel Gatón
  2. Scopul datelor: Control SPAM, gestionarea comentariilor.
  3. Legitimare: consimțământul dvs.
  4. Comunicarea datelor: datele nu vor fi comunicate terților decât prin obligație legală.
  5. Stocarea datelor: bază de date găzduită de Occentus Networks (UE)
  6. Drepturi: în orice moment vă puteți limita, recupera și șterge informațiile.

  1.   Alvaro Ortiz imagine de substituent el a spus

    Uf ... cam confuz.

  2.   tonic el a spus

    * / 30 lipsește (în câmpul de minute) care rulează la fiecare 30 de minute ...

    1.    erm3nda el a spus

      Doar asta aveam să comentez până când am decis să revizuiesc comentariile 😀
      Acest modificator este o informație foarte importantă și ceva foarte util.

      1.    Kika el a spus

        Buna ziua!
        Chiar acum testez o configurație la fiecare 45 de minute.

        * / 45 * * * *, iar instrucțiunea este executată la 45 de minute din fiecare oră ȘI în fiecare oră. Adică:

        Se execută la 3:45, apoi la 4:00, 4:45, apoi la 5:00, 5:45, 6:00, 6:45 și așa mai departe.

        Am ceva greșit? Ce pot face pentru a fi doar la fiecare 45 de minute sau cel puțin o dată la 45 de minute la fiecare oră.

    2.    Kika el a spus

      Buna ziua!
      Chiar acum testez o configurație la fiecare 45 de minute.

      * / 45 * * * *, iar instrucțiunea este executată la 45 de minute din fiecare oră ȘI în fiecare oră. Adică:

      Se execută la 3:45, apoi la 4:00, 4:45, apoi la 5:00, 5:45, 6:00, 6:45 și așa mai departe.

      Am ceva greșit? Ce pot face pentru a fi doar la fiecare 45 de minute sau cel puțin o dată la 45 de minute la fiecare oră.

  3.   Moale el a spus

    Bună ziua, sunt foarte utile informațiile pentru a clarifica cum funcționează cron.
    Bytes

  4.   Moale el a spus

    pentru *

  5.   Vânător el a spus

    Excelent, mulțumesc pentru clarificarea modului în care funcționează cron .. hai să punem o mână de ajutor 🙂

  6.   Iacov el a spus

    Această linie, așa cum am înțeles, va fi executată la 10:15, corectați-mă dacă greșesc
    Ei bine, acolo scrie 10:15 dimineața
    15 22 * * * utilizator /home/usuario/scripts/update.sh

  7.   Agustin el a spus

    Salut! informații foarte bune.
    Pentru a executa un script la fiecare jumătate de oră, linia care ar trebui adăugată la CronTab ar fi: "30 * * * * root Scrip.sh" Corect? Mulțumesc mult!

  8.   să folosim Linux el a spus

    Nu. Dacă îmi amintesc bine, pentru asta trebuie să puneți / 30 * * * * root Scrip.sh.
    Adică, adăugați / înainte de 30.
    Noroc! Paul.

  9.   Jonathan el a spus

    Buna ziua mi-a placut postarea ta, este foarte completa dar am vrut sa te intreb ceva.
    Am probleme cu această comandă și una ca „la”.

    Vreau să rulez un script la un anumit moment și să pun

    la -f /home/mi_user/Desk/script.sh 18:08 exemplu

    iar scriptul nu este executat pe ecran, adică în terminal, este executat în fundal?

    Și cu cron mi se întâmplă același lucru, editez fișierul crontab cu „crontab -e”

    la final adaug această linie:

    46 19 my_user /home/mi_user/Desk/script.sh

    și nu face nimic, nu arată scenariul.

    Vreo idee? Vă mulțumesc foarte mult și vă cereți scuze pentru orice neplăceri

    1.    să folosim Linux el a spus

      Pentru ca terminalul să apară, poate fi necesar să rulați terminalul și să treceți scriptul ca parametru.

      De exemplu:

      lxterminal -e "my_user /home/my_user/Desk/script.sh"

      Parametrul de utilizat poate varia în funcție de emulatorul de terminal pe care îl utilizați.

      Sper să funcționeze.

      Îmbrăţişare! Paul.

  10.   patrecas el a spus

    Contribuția este apreciată.

    10 puncte !!

    salut2 !!

  11.   Rodolfo el a spus

    Vă mulțumesc foarte mult, m-a ajutat foarte mult să clarific unele lucruri, mulțumiri totale, pentru mai multe detalii sau îndoieli voi merge la PAGINA OMULUI, salutări reiterate.

  12.   jahir el a spus

    Unchiul vă mulțumesc foarte mult, am citit și testat exemplele. multumesc mult ... este foarte de inteles. Noroc

  13.   geovanni el a spus

    Am folosit ubuntu Server 12.04.2 LTS și se folosește versiunea de crontab pe care o am, pentru a șterge lista de joburi a utilizatorului, crontab -r (și -l, așa cum spune acest manual). Sigur că este vorba de versiuni.

    Pe de altă parte, odată am rulat doar crontab și acest tip de lăsați-mă să îmi creez propriul fișier de execuție, dar acesta nu a fost cel care a fost executat. Cel care rulează este cel din / etc / crontab. poate cineva va folosi comentariul.

    PS (am căutat cu localizarea și unde este crontab, dar a returnat doar adresa menționată anterior și un alt fișier care este criptat, deci dacă cel care a fost executat a fost cel din / etc / crontab, dar când executam comanda crontab -e, a mea ar fi apar cu toate joburile pe care le definisem) unde a fost stocat acest fișier '???? Salutari. Mă conectez întotdeauna cu root.

  14.   Sebastian el a spus

    Excelent, foarte util !!!

  15.   mmm el a spus

    Bună ziua, aș vrea să fac asta ………… «15 10 * * * root ifdown eth0»

    adică, la un moment dat, placa de rețea se oprește ………… ei bine, am pus-o în crontab și nu a funcționat …… .. ce se întâmplă?

    Felicitări și mulțumiri

  16.   Miguel el a spus

    Ați ratat definirea „lun” după titlul „Adăugați sarcini la crontab”

    Articolul este încă frumos, cron este extrem de util.

  17.   Oscar el a spus

    Cât de mișto a fost acel post bun, întrebați-mă
    Dacă vreau să țin evidența înregistrărilor lăsate de executarea sarcinilor, unde o pot vedea?

    este să decid că vreau să văd istoricul acțiunilor făcute în trecut în acest fișier și vreau să văd cine l-a modificat și data

    Gracias

  18.   Oscar el a spus

    Vreau să verific istoricul modificărilor

    cum o pot face

    Gracias

  19.   Andres Ledo el a spus

    Bună dimineața,

    Cred că în scriptul ubuntu ați făcut o greșeală, ați pus ap-get -y upgrade în loc de apt-get -y upgrade. (Ai lăsat o t).

    Un salut.

    1.    să folosim Linux el a spus

      La fel este. Mulțumesc!
      Îmbrăţişare! Paul

  20.   Gabriel el a spus

    Vreau să știu cum să creez un fișier cron pentru a putea specifica fiecare dată când este executat, directorul etc.

  21.   Valentin el a spus

    Vă mulțumim pentru clarificarea funcționării și a comenzilor de bază pentru cron, acum pentru a vă distra puțin.

  22.   Sander el a spus

    Ori de câte ori caut informații despre orice subiect legat de Gnu / Linux, fac o rundă rotundă pentru a găsi întotdeauna în 90% din cazuri cel mai bun tutorial din această mare comunitate, cred că de acum înainte voi începe aici și apoi în altă parte.

    În ceea ce priveşte

    1.    să folosim Linux el a spus

      Mulțumesc Sander! O imbratisare! Paul.

  23.   Daryyo el a spus

    dom = ziua lunii
    dow = ziua săptămânii
    este mai ușor dacă te asociezi

  24.   Pascal el a spus

    Vă mulțumesc foarte mult, foarte complet și bine explicat.

  25.   Maxila el a spus

    Acesta este același lucru pe care ni l-a dat profesorul meu de sistem de operare, nu schimb nimic, acum văd de ce clasa este atât de proastă. - Ei bine, este la fel ca temele xD

  26.   Marcelo el a spus

    Estimat,

    Interogare, poate fi limitată durata unei sarcini?
    De exemplu, am o sarcină care se repetă la fiecare 5 minute, la repetare, dacă acea sarcină este încă activă, ucideți-o și rulați din nou.

    Multumesc,
    Marcelo.-

    1.    să folosim Linux el a spus

      Bună, Marcelo!

      Cred că ar fi mai bine dacă ridicați această întrebare în serviciul nostru de întrebări și răspunsuri cere DesdeLinux astfel încât întreaga comunitate să vă poată ajuta cu problema dumneavoastră.

      O îmbrățișare, Pablo.

  27.   aj el a spus

    post bun.
    Care este comanda per terminal pentru a adăuga sarcini în crontab (fără a intra în crontab și adăugându-le manual cu „crontab -e” sau înlocuirea crontabului cu un alt crontab cu „fișier crontab”).
    Ideea este de a crea un script extern pentru a adăuga sarcinile la crontab
    Mulţumiri

    1.    david el a spus

      mi se pare că ai putea folosi „ecou” orice vrei să adaugi ”| cat >> 'calea cronotab (/ etc / cronotab)' «

  28.   Rafael Vera el a spus

    Cum ar funcționa o expresie exact la fiecare 3 zile

  29.   José Antonio el a spus

    Buna ziua.

    Am o problemă la executarea unui job cron.

    Execut următoarea sarcină cu cronta -e:

    01 * * * * root /home/user/script/myfile.sh

    dar sarcina nu este realizată. Am verificat dacă myfile.sh are permisiunea de a executa și că utilizatorul care o execută este root.

    Execut aceeași sarcină în / etc / crontab și după repornirea serviciului, nici pentru mine nu funcționează.
    Conținutul myfile.sh este o comandă care actualizează un DB și, dacă îl rulez în consolă, funcționează.
    vreo idee care ar putea fi problema?

    1.    fredd el a spus

      Este posibil ca utilizatorul bazei de date să nu aibă toate permisiunile și va trebui mai întâi să exportați variabilele de mediu din motorul bazei de date.
      De exemplu, în db2 această linie ar merge la începutul scriptului
      . / home / db2inst1 / sqllib / db2profile

      O altă cauză ar putea fi faptul că scriptul necesită conectarea la baza de date, face conexiunea la baza de date în cadrul scriptului

  30.   LA3 el a spus

    Nu știam că trebuie să repornesc crondul, mă lupt cu asta de ceva vreme

  31.   Kenia el a spus

    Ei vor ști cum să indice că sarcina se execută la fiecare sfârșit de lună, la ora indicată .. detaliul este că nu pot realiza cum știu că durează ultima zi a fiecărei luni .. ??? A trebuit să le notez pe rând, dar când vine sfârșitul lunii februarie că este biciesto este complicat pentru mine ..

  32.   Isus el a spus

    o zi buna!!

    Cum opresc procesul care se execută în crontab?

  33.   Isus el a spus

    proces * …………

  34.   Julianna el a spus

    S-ar putea să mă ajuți? eu tenho um script de minha authored that does not work no crontab! JB dei toate permisele, niciun cron sau utilizator privat care să îl poată executa - cel mai mult nu se întâmplă nimic! Aș vrea să știu dacă mă puteți ajuta, alte lucruri funcționează fără cron! Vlws

  35.   Anthox el a spus

    Cum ați pune o sarcină în fiecare zi a lunii (zile: 31-30-28)?

  36.   tfercho el a spus

    După cum știți, comanda su este utilizată pentru a schimba utilizatorul într-o consolă. Dacă folosesc comanda su astfel: "utilizatorul tău" schimbă utilizatorul, dar fără setările corespunzătoare de "utilizator", dacă rulez su ca: "su - utilizator" schimbă utilizatorul încărcând setările utilizatorului. Cu cron indic utilizatorul, dar cum pot încărca setările acestui utilizator?

  37.   Jefui el a spus

    Și dacă vreau să-l opresc?

  38.   regi el a spus

    Buna,
    Nu știu ce fac greșit, dar urmez pașii și nu se execută nimic. Am încercat:
    59 * * * * / usr / bin / gedit
    * * * * * / usr / bin / gedit
    * * * * * root / usr / bin / gedit
    * * * * * usr / bin / test.sh
    * * * * * rădăcină usr / bin / test.sh

    si nimic deloc. Nu execută nimic. Am repornit și totul.

  39.   Ferqos el a spus

    mulţumesc mult