Cron & crontab, forklaret

Lucain han offentliggjorde et stykke tid siden fremragende tutorial om cron og crontab som jeg synes er værd at dele. Cron svarer til en plan svarende til planlagte opgaver i Windows, kun at det håndteres fra terminalen. De, der foretrækker en visuel grænseflade for at nå det samme mål, kan se dette en anden artikel.

Hvad er Cron?

Navnet cron kommer fra den græske chronos, hvilket betyder "tid". I Unix-operativsystemet er cron en regelmæssig baggrundsprocessmanager (dæmon), der kører processer eller scripts med jævne mellemrum (for eksempel hvert minut, dag, uge ​​eller måned). De processer, der skal udføres, og det tidspunkt, hvor de skal udføres, er specificeret i crontab-filen.

Como værker

Cron-dæmonen starter fra /etc/rc.d/ o /etc/init.d afhængigt af fordelingen. Cron løber i baggrunden, kontrollerer crontab-opgavetabellen hvert minut / Etc / crontab eller / var / spole / cron på jagt efter opgaver, der skal udføres. Som bruger kan vi tilføje kommandoer eller scripts med opgaver til cron for at automatisere nogle processer. Dette er f.eks. Nyttigt at automatisere opdateringen af ​​et system eller et godt backupsystem.

relateret artikel:
Selvstudie: Installer pakkerne .tar.gz og .tar.bz2

Hvad er Crontab?

Crontab er en simpel tekstfil, der gemmer en liste over kommandoer, der skal udføres på et tidspunkt, der er angivet af brugeren. Crontab vil kontrollere datoen og klokkeslættet, som scriptet eller kommandoen skal udføres, udførelsestilladelserne, og det gør det i baggrunden. Hver bruger kan have deres egen crontab-fil, faktisk / Etc / crontab det antages at være rodbrugerens crontab-fil, når normale brugere (og endda root) vil generere deres egen crontab-fil, så bruger vi kommandoen crontab.

Crontab er den nemmeste måde at styre cron-opgaver på multi-user-systemer på, enten som en simpel systembruger eller root-bruger.

Brug af crontab

Vi starter med et simpelt eksempel.

Vi vil automatisere opdateringen af ​​et system for at fjerne det irriterende ved "Jeg skal altid opdatere, og det kan jeg ikke lide!"

relateret artikel:
Kommandoer til at kende systemet (identificer hardware og nogle softwarekonfigurationer)

Først og fremmest laver vi et script. Dette script kaldes af cron og indeholder alle de instruktioner, vi vil have det til at gøre, derfor er det nødvendigt at teste det i flere tilfælde og på flere måder, før det inkluderes i cron, et simpelt opdateringsscript som dette:

#! / bin / bash #script-opdateringseksempel #Vælg din distribution # debian-ubuntu # apt-get update & apt-get -y upgrade #fedora #yum -y update #Arch #pacman --noconfirm -Syu

Fjern # fra din distrolinje. Hvis det er Ubuntu / Debian, starter det med apt-get.

Vi gemmer scriptet som update.sh (f.eks. Scriptsmappe dit hjem). Vi ændrer udførelsestilladelserne for det nævnte script med:

chmod a + x ~ / scripts / update.sh

Vi kører scriptet et par gange for at kontrollere, at alt kører problemfrit, vi ændrer det, der er nødvendigt (det må ikke indeholde fejl, hvis ikke cron kun gentager en fejl igen og igen). Nu for at tilføje opgaven til vores crontab.

Føj opgaver til crontab

Vi udfører udgaven af ​​crontab med crontab -e, i nogle distroer (som f.eks. Ubuntu) giver det os mulighed for at vælge den teksteditor, vi ønsker, resten har vi tilbage med vi. Crontab-filen vil se sådan ud.

# mh dom mon dow brugerkommando

hvor:

  • m svarer til det øjeblik scriptet udføres, værdien varierer fra 0 til 59
  • h det nøjagtige tidspunkt, 24-timers format håndteres, værdierne varierer fra 0 til 23, hvor 0 er 12:00 midnat.
  • gave refererer til månedsdagen, for eksempel kan du angive 15, hvis du vil køre hver 15. dag
  • dow betyder ugedagen, det kan være numerisk (0 til 7, hvor 0 og 7 er søndag) eller de første 3 bogstaver på dagen på engelsk: man, ti, ons, tors, fre, lør, sol.
  • bruger definerer den bruger, der udfører kommandoen, den kan være root eller en anden bruger, så længe de har tilladelse til at udføre scriptet.
  • kommando henviser til kommandoen eller den absolutte sti til det script, der skal udføres, eksempel: /home/usuario/scripts/update.sh, hvis det kalder et script, skal det være eksekverbart

For at være klar et par eksempler på cron-opgaver forklaret:

15 10 * * * bruger /home/bruger/scripts/update.sh

Det kører scriptet update.sh kl. 10:15 hver dag

15 22 * * * bruger /home/bruger/scripts/update.sh

Det kører scriptet update.sh kl. 10:15 hver dag

00 10 * * 0 root apt-get -y opdatering Root user

Den kører en opdatering hver søndag kl. 10

45 10 * * sun root apt-get -y opdatering

Rodbrugeren kører en opdatering hver søndag (søn) kl. 10:45

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

Den 20. november kl. 7:30 kører brugeren scriptet

30 7 11 11 solbruger /home/usuario/scripts/pastel_con_velitas.sh

Den 11. november kl. 7:30, og det er søndag, fejrer brugeren sin sysadmin (det vil sige mig)

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

En irriterende påmindelse hvert minut hver time hver dag (IKKE anbefales).

De kan stadig håndteres specielle intervaller:

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

5:30 om eftermiddagen hver dag fra mandag til fredag.

00 12 1,15,28 * *

Kl. 12 hver første, femtende og 28. i hver måned (ideel til lønningsliste)

Hvis dette er forvirrende, skal du håndtere crontab specielle strenge til at definere disse intervaller.

@reboot Kør én gang ved opstart
@yearly kører kun en gang om året: 0 0 1 1 *
@ hvert år det samme som @ årligt
@monthly kører en gang om måneden, den første dag: 0 0 1 * *
@ ugentlig ugentlig det første minut i den første times uge. 0 0 * * 0 ″.
@ dagligt dagligt kl. 12:00 0 0 * * *
@ midnat samme som @daily
@hourly i det første minut i hver time: 0 * * * *

Dens anvendelse er meget enkel.

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

Sidst men ikke mindst:

Cron jobledelse

crontab-fil

Udskift den eksisterende crontab-fil med en brugerdefineret fil

crontab -e

Rediger brugerens crontab-fil, hver nye linje bliver en ny crontab-opgave.

crontab-l

Liste over alle brugerens crontab-opgaver

crontab -d

Slet brugerens crontab

crontab -c dir

Definerer brugerens crontab-bibliotek (dette skal have brugerens skrive- og eksekveringstilladelser)

crontab -u bruger

præfiks til at håndtere en anden brugers crontab, eksempler:

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

Dette værktøj kan, som mange andre, ses mere detaljeret og mere detaljeret i:

Tak Lucain!

Indholdet af artiklen overholder vores principper for redaktionel etik. Klik på for at rapportere en fejl her.

48 kommentarer, lad dine

Efterlad din kommentar

Din e-mailadresse vil ikke blive offentliggjort. Obligatoriske felter er markeret med *

*

*

  1. Ansvarlig for dataene: Miguel Ángel Gatón
  2. Formålet med dataene: Control SPAM, management af kommentarer.
  3. Legitimering: Dit samtykke
  4. Kommunikation af dataene: Dataene vil ikke blive kommunikeret til tredjemand, undtagen ved juridisk forpligtelse.
  5. Datalagring: Database hostet af Occentus Networks (EU)
  6. Rettigheder: Du kan til enhver tid begrænse, gendanne og slette dine oplysninger.

  1.   Billede af Alvaro Ortiz sagde han

    Ugh ... lidt forvirrende.

  2.   tonic sagde han

    * / 30 mangler (i minutfeltet), der kører hvert 30. minut ...

    1.    erm3nda sagde han

      Jeg skulle bare kommentere dette, indtil jeg besluttede at gennemgå kommentarerne 😀
      Denne modifikator er et meget vigtigt stykke information og noget meget nyttigt.

      1.    KIKA sagde han

        Hej!
        Lige nu tester jeg en konfiguration hvert 45. minut.

        * / 45 * * * *, og instruktionen udføres i 45 minutter hver time OG hver time. Det vil sige:

        Den kører kl. 3:45, derefter 4:00, 4:45, derefter 5:00, 5:45, 6:00, 6:45 osv.

        Jeg har noget galt? Hvad kan jeg gøre, så det kun er hvert 45. minut eller mindst en gang med 45 minutter hver time?

    2.    KIKA sagde han

      Hej!
      Lige nu tester jeg en konfiguration hvert 45. minut.

      * / 45 * * * *, og instruktionen udføres i 45 minutter hver time OG hver time. Det vil sige:

      Den kører kl. 3:45, derefter 4:00, 4:45, derefter 5:00, 5:45, 6:00, 6:45 osv.

      Jeg har noget galt? Hvad kan jeg gøre, så det kun er hvert 45. minut eller mindst en gang med 45 minutter hver time?

  3.   Slack sagde han

    Hej super nyttige oplysningerne for at afklare, hvordan cron fungerer.
    Bytes

  4.   Slack sagde han

    til *

  5.   jæger sagde han

    Fremragende, tak for at afklare, hvordan cron fungerer .. lad os lægge en lille hånd 🙂

  6.   Jacob sagde han

    Denne linje, som jeg forstår den, vil blive udført kl. 10:15, korriger mig, hvis jeg tager fejl
    Nå der står der 10:15
    15 22 * * * bruger /home/bruger/scripts/update.sh

  7.   Agustin sagde han

    Hej! meget god info.
    For at udføre et script hver halve time ville linjen, der skulle føjes til CronTab, være: "30 * * * * root Scrip.sh" Korrekt? Mange tak!

  8.   lad os bruge linux sagde han

    Nej. Hvis jeg husker rigtigt, skal du til det sætte / 30 * * * * root Scrip.sh.
    Det vil sige tilføje / før 30.
    Skål! Paul.

  9.   Jonathan sagde han

    Hej Jeg kunne godt lide dit indlæg, det er meget komplet, men jeg vil gerne spørge dig om noget.
    Jeg har problemer med denne kommando og en som "at".

    Jeg vil køre et script på et bestemt tidspunkt og sætte det

    på -f /home/mi_user/Desk/script.sh 18:08 eksempel

    og scriptet udføres ikke på skærmen, det vil sige i terminalen, udføres det i baggrunden?

    Og med cron sker det samme med mig, jeg redigerer crontab-filen med "crontab -e"

    i slutningen tilføjer jeg denne linje:

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

    og det gør ingenting, det viser ikke scriptet.

    Nogle forslag? Mange tak og undskyld for ulejligheden

    1.    lad os bruge linux sagde han

      For at terminalen vises, skal du muligvis køre terminalen og videregive scriptet som en parameter.

      For eksempel:

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

      Parameteren, der skal bruges, kan variere afhængigt af den terminalemulator, du bruger.

      Jeg håber, det fungerer.

      Kram! Paul.

  10.   patretcas sagde han

    Bidraget værdsættes.

    10 point !!

    salu2 !!

  11.   Rodolfo sagde han

    Mange tak, det hjalp mig meget med at afklare nogle ting, total tak, for flere detaljer eller spørgsmål vil jeg gå til MAN-SIDEN, gentagne hilsener.

  12.   jahir sagde han

    Onkel meget tak, jeg har læst og testet eksemplerne. mange tak ... det er meget forståeligt. Skål

  13.   Geovanni sagde han

    Jeg brugte ubuntu Server 12.04.2 LTS, og den version af crontab, jeg har, til at slette listen over brugerens job bruges, crontab -r (og -l, som denne manual siger). Sikker på, at det er ved spørgsmålet om versioner.

    På den anden side kørte jeg engang kun crontab, og denne slags lad mig oprette min egen eksekveringsfil, men det var ikke den, der blev udført. Den, der kører, er den i / etc / crontab. måske bruger nogen kommentaren.

    PS (jeg søger med find og hvor er crontab, men den returnerede kun den førnævnte adresse og en anden fil, der er krypteret, så hvis den, der blev udført, var den i / etc / crontab, men når kommandoen crontab -e blev udført, syntes min med alle de job, jeg havde defineret) hvor blev denne fil gemt '???? Hilsen. Jeg logger altid ind med root.

  14.   Sebastian sagde han

    Fremragende, meget nyttigt !!!

  15.   mmm sagde han

    Hej, jeg vil gerne gøre dette ………… «15 10 * * * root ifdown eth0»

    det vil sige at netværkskortet på et bestemt tidspunkt er slukket ………… godt, jeg lagde det i crontab og det fungerede ikke …… .. hvad sker der?

    Saludos y gracias

  16.   Miguel sagde han

    Du savnede at definere "mon" efter titlen "Føj opgaver til crontab"

    Artiklen er stadig flot, cron er ekstremt nyttig.

  17.   OScar sagde han

    Hvor sejt var det gode indlæg, spørg mig
    Hvis jeg vil holde styr på de poster, der er tilbage ved udførelsen af ​​opgaver, hvor kan jeg se det?

    er decdir Jeg vil se historikken over de handlinger, der er foretaget tidligere i denne fil, og jeg vil se, hvem der har ændret den og datoen

    tak

  18.   oscar sagde han

    Jeg vil kontrollere ændringshistorikken for dette

    hvordan kan jeg gøre det

    tak

  19.   Andres Ledo sagde han

    Godmorgen,

    Jeg tror, ​​at i ubuntu-scriptet har du lavet en fejl, du har sat ap-get -y opgradering i stedet for apt-get -y opgradering. (Du har efterladt et t).

    En hilsen.

    1.    lad os bruge linux sagde han

      Det er det også. Tak skal du have!
      Kram! Paul

  20.   Gabriel sagde han

    Jeg vil vide, hvordan man opretter en cron-fil for at kunne specificere det tidspunkt, hver gang det udføres, biblioteket osv.

  21.   Valentin sagde han

    Tak for at afklare operationen og de grundlæggende kommandoer til cron, nu for at underholde dig selv lidt.

  22.   Sander sagde han

    Når jeg leder efter information om ethvert emne relateret til Gnu / Linux, går jeg rundt og til sidst og finder i 90% af tilfældene altid den bedste tutorial i dette store samfund, jeg tror, ​​at jeg fra nu af begynder her og derefter andre steder .

    hilsen

    1.    lad os bruge linux sagde han

      Tak Sander! Et kram! Paul.

  23.   daryo sagde han

    dom = dag i måneden
    dow = ugedag
    det er lettere, hvis du forbinder

  24.   Paschal sagde han

    Mange tak, meget komplet og godt forklaret.

  25.   Maxillia sagde han

    Dette er det samme som min OS-lærer gav os, jeg ændrer ikke noget, nu kan jeg se, hvorfor klassen er så dårlig. -.

  26.   Marcelo sagde han

    Kære,

    Forespørgsel, kan varigheden af ​​en opgave begrænses?
    For eksempel har jeg en opgave, der gentages hvert 5. minut, ved gentagelse, hvis den opgave stadig er aktiv, dræb den og kør igen.

    Tak,
    Marcelo. -

    1.    lad os bruge linux sagde han

      Hej Marcelo!

      Jeg tror, ​​det ville være bedre, hvis du rejser dette spørgsmål i vores spørgsmål og svar service kaldet Spørg FromLinux så hele samfundet kan hjælpe dig med dit problem.

      Et knus, Pablo.

  27.   aj sagde han

    godt indlæg.
    Hvad er kommandoen pr. Terminal til at tilføje opgaver til crontab (uden at komme ind i crontab og tilføje dem manuelt med 'crontab -e' eller erstatte crontab med en anden crontab med 'crontab-fil').
    Ideen er at oprette et eksternt script for at tilføje opgaverne til crontab
    Tak

    1.    david sagde han

      det ser ud til, at du kunne bruge 'ekko', hvad du vil tilføje '| kat >> 'cronotab-sti (/ etc / cronotab)' «

  28.   Rafael Vera sagde han

    Hvordan ville et udtryk køre hver 3. dag nøjagtigt

  29.   José Antonio sagde han

    Hej.

    Jeg har et problem med at udføre et cron-job.

    Jeg kører følgende opgave med cronta -e:

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

    men opgaven er ikke udført. Jeg har bekræftet, at myfile.sh har tilladelse til udførelse, og at den bruger, der udfører den, er root.

    Jeg kører den samme opgave i / etc / crontab, og efter genstart af tjenesten fungerer den heller ikke for mig.
    Indholdet af myfile.sh er en kommando, der opdaterer en DB, og hvis jeg kører den i konsollen, fungerer den.
    nogen idé om, hvad problemet kan være?

    1.    Fredd sagde han

      Databasebrugeren har muligvis ikke alle tilladelser, og du bliver først nødt til at eksportere miljøvariablerne fra din databasemotor.
      For eksempel i db2 vil denne linje gå til begyndelsen af ​​scriptet
      . / hjem / db2inst1 / sqllib / db2profile

      En anden årsag kan være, at scriptet kræver forbindelse til databasen, oprette forbindelse til databasen i scriptet

  30.   LA3 sagde han

    Jeg vidste ikke, at jeg var nødt til at genstarte kronen, jeg havde kæmpet med dette i et stykke tid

  31.   Kenya sagde han

    De vil vide, hvordan de skal angive, at opgaven køres i slutningen af ​​måneden, på det angivne tidspunkt .. detaljen er, at jeg ikke kan opnå, hvordan jeg ved, at det tager den sidste dag i hver måned .. ??? Jeg var nødt til at skrive dem en efter en ned, men når slutningen af ​​februar måned kommer, at det er mest, er det kompliceret for mig ..

  32.   Jesus sagde han

    god dag!!

    Hvordan stopper jeg den proces, der udføres i crontab?

  33.   Jesus sagde han

    proces * …………

  34.   Julianna sagde han

    Kan det være, at du kan hjælpe mig? eu tenho um script af minha forfattet, der ikke fungerer ingen crontab! jб dei alle tilladelser, ingen privat specifik cron eller bruger, der kan udføre det - der sker intet! Jeg vil gerne vide, om du kan hjælpe mig, nogle andre ting fungerer ikke cron! Vlws

  35.   Anthox sagde han

    Hvordan vil du sætte en opgave til at køre hver sidste dag i måneden (dage: 31-30-28)?

  36.   tfercho sagde han

    Som du allerede ved, bruges su-kommandoen til at skifte bruger i en konsol. Hvis jeg bruger kommandoen su således: "din bruger" skifter bruger, men uden de korrekte indstillinger for "bruger", hvis jeg kører su som: "su - bruger" skift bruger ved at indlæse brugerindstillingerne. Med cron angiver jeg brugeren, men hvordan indlæser jeg indstillingerne for denne bruger?

  37.   Røve sagde han

    Og hvis jeg vil stoppe det?

  38.   Regi sagde han

    Hej,
    Jeg ved ikke, hvad jeg laver forkert, men jeg følger trinene, og der udføres intet. Jeg har forsøgt:
    59 * * * * / usr / bin / gedit
    * * * * * / usr / bin / gedit
    * * * * * rod / usr / bin / gedit
    * * * * * usr / bin / test.sh
    * * * * * rod usr / bin / test.sh

    og slet intet. Det udfører ikke noget. Jeg har genstartet og alt.

  39.   Ferqos sagde han

    mange tak