Cron & crontab, uitgelegd

Lucas hij publiceerde een tijdje geleden uitstekende tutorial over cron en crontab waarvan ik denk dat het de moeite waard is om te delen. Cron is een soort equivalent van geplande taken in Windows, alleen dat het wordt afgehandeld vanaf de terminal. Wie de voorkeur geeft aan een visuele interface om hetzelfde doel te bereiken, kan dit zien een ander item.

Wat is cron?

De naam cron komt van het Griekse chronos wat "tijd" betekent. In het Unix-besturingssysteem is cron een reguliere procesmanager op de achtergrond (daemon) die processen of scripts met regelmatige tussenpozen uitvoert (bijvoorbeeld elke minuut, dag, week of maand). De processen die moeten worden uitgevoerd en het tijdstip waarop ze moeten worden uitgevoerd, worden gespecificeerd in het crontab-bestand.

Cómo werken

De cron-daemon begint vanaf /etc/rc.d/ o / Etc / init.d afhankelijk van de distributie. Cron wordt op de achtergrond uitgevoerd, controleert de crontab-taaktabel elke minuut / Etc / crontab of / var / spool / cron op zoek naar taken die moeten worden uitgevoerd. Als gebruiker kunnen we commando's of scripts met taken aan cron toevoegen om sommige processen te automatiseren. Dit is bijvoorbeeld handig om de update van een systeem of een goed back-upsysteem te automatiseren.

Gerelateerd artikel:
Tutorial: Installeer .tar.gz en .tar.bz2 pakketten

Wat is Crontab?

Crontab is een eenvoudig tekstbestand dat een lijst met opdrachten opslaat die moeten worden uitgevoerd op een door de gebruiker opgegeven tijdstip. Crontab controleert de datum en tijd waarop het script of commando moet worden uitgevoerd, de uitvoeringsrechten en het zal dit op de achtergrond doen. Elke gebruiker kan zijn eigen crontab-bestand hebben, in feite het / Etc / crontab Aangenomen wordt dat het het crontab-bestand van de rootgebruiker is, als normale gebruikers (en zelfs root) hun eigen crontab-bestand willen genereren, zullen we het crontab-commando gebruiken.

Crontab is de gemakkelijkste manier om cron-taken te beheren op systemen met meerdere gebruikers, hetzij als een eenvoudige systeemgebruiker of als rootgebruiker.

Crontab gebruiken

We beginnen met een eenvoudig voorbeeld.

We gaan de update van een systeem automatiseren, om het vervelende "Ik moet altijd updaten en dat vind ik niet leuk!"

hoe te
Gerelateerd artikel:
Bevelen om het systeem te kennen (identificeer hardware en sommige softwareconfiguraties)

Allereerst maken we een script. Dit script wordt aangeroepen door cron en zal alle instructies bevatten die we willen dat het doet, daarom is het nodig om het in verschillende gevallen en op verschillende manieren te testen voordat je het in cron opneemt, een eenvoudig updatescript zoals dit:

#! / bin / bash # script update voorbeeld # kies uw distributie # debian-ubuntu # apt-get update & apt-get -y upgrade #fedora #yum -y update #Arch #pacman --noconfirm -Syu

Verwijder de # uit je distro-lijn. In het geval dat het Ubuntu / Debian is, begint het met apt-get.

We slaan het script op als update.sh (bijv. Scripts in de directory van uw huis). We wijzigen de uitvoeringsrechten van het genoemde script met:

chmod a + x ~ / scripts / update.sh

We draaien het script een paar keer om te controleren of alles soepel verloopt, we passen aan wat nodig is (het mag geen fouten bevatten, anders herhaalt cron een fout alleen maar keer op keer). Nu om de taak toe te voegen aan onze crontab.

Voeg taken toe aan crontab

We voeren de editie van de crontab uit met crontab -e, in sommige distributies (zoals Ubuntu) geeft het ons de mogelijkheid om de gewenste teksteditor te kiezen, de rest houden we over met vi. Het crontab-bestand ziet er ongeveer zo uit.

# mh dom mon dow gebruikerscommando

waar:

  • m komt overeen met de minuut dat het script wordt uitgevoerd, de waarde varieert van 0 tot 59
  • h de exacte tijd, het 24-uurs formaat wordt afgehandeld, de waarden variëren van 0 tot 23, waarbij 0 middernacht is.
  • gift verwijst naar de dag van de maand, u kunt bijvoorbeeld 15 opgeven als u elke 15 dagen wilt hardlopen
  • dow betekent de dag van de week, deze kan numeriek zijn (0 tot 7, waarbij 0 en 7 zondag zijn) of de eerste 3 letters van de dag in het Engels: ma, di, wo, do, vrij, za, zo.
  • gebruiker definieert de gebruiker die het commando zal uitvoeren, het kan root zijn, of een andere gebruiker, zolang ze toestemming hebben om het script uit te voeren.
  • commando verwijst naar de opdracht of het absolute pad van het script dat moet worden uitgevoerd, bijvoorbeeld: /home/usuario/scripts/update.sh, als het een script aanroept, moet het uitvoerbaar zijn

Voor de duidelijkheid een paar voorbeelden van cron-taken uitgelegd:

15 10 * * * gebruiker /home/user/scripts/update.sh

Het update.sh-script wordt elke dag om 10:15 uur uitgevoerd

15 22 * * * gebruiker /home/user/scripts/update.sh

Het update.sh-script wordt elke dag om 10:15 uur uitgevoerd

00 10 * * 0 root apt-get -y update rootgebruiker

Elke zondag om 10 uur wordt er een update uitgevoerd

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

De rootgebruiker zal elke zondag (zo) om 10:45 uur een update uitvoeren

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

Op 20 november om 7 uur zal de gebruiker het script draaien

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

Op 11 november om 7 uur en dat is zondag, viert de gebruiker zijn sysadmin (dat wil zeggen, ik)

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

Elke minuut van elk uur elke dag een vervelende herinnering (NIET aanbevolen).

Ze kunnen nog steeds worden afgehandeld speciale reeksen:

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

Elke dag om 5 uur van maandag tot en met vrijdag.

00 12 1,15,28 * *

Elke eerste, vijftiende en 12ste van elke maand om 28 uur 's middags (ideaal voor salarisadministratie)

Als dit verwarrend is, handelt crontab speciale strings om deze bereiken te definiëren.

@reboot Eén keer uitvoeren bij het opstarten
@yearly draait slechts één keer per jaar: 0 0 1 1 *
@annually hetzelfde als @yearly
@monthly wordt eenmaal per maand uitgevoerd, de eerste dag: 0 0 1 * *
@weekly Wekelijks de eerste minuut van het eerste uur van de week. 0 0 * * 0 ″.
@dagelijks dagelijks, om 12 uur. 00 0 * * *
@midnight hetzelfde als @daily
@hourly op de eerste minuut van elk uur: 0 * * * *

Het gebruik ervan is heel eenvoudig.

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

Tenslotte:

Beheer van cron-taken

crontab-bestand

Vervang het bestaande crontab-bestand door een door de gebruiker gedefinieerd bestand

crontab -e

Bewerk het crontab-bestand van de gebruiker, elke nieuwe regel wordt een nieuwe crontab-taak.

crontab -l

Maak een lijst van alle crontab-taken van de gebruiker

crontab-d

Verwijder de crontab van de gebruiker

crontab -c richt

Definieert de crontab-map van de gebruiker (deze moet de schrijf- en uitvoeringsrechten van de gebruiker hebben)

crontab -u gebruiker

prefix om de crontab van een andere gebruiker af te handelen, voorbeelden:

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

Deze tool kan, net als vele andere, dieper en in meer detail worden bekeken in:

Bedankt Lucain!

48 reacties, laat de jouwe achter

Laat je reactie achter

Uw e-mailadres wordt niet gepubliceerd. Verplichte velden zijn gemarkeerd met *

*

*

  1. Verantwoordelijk voor de gegevens: Miguel Ángel Gatón
  2. Doel van de gegevens: Controle SPAM, commentaarbeheer.
  3. Legitimatie: uw toestemming
  4. Mededeling van de gegevens: De gegevens worden niet aan derden meegedeeld, behalve op grond van wettelijke verplichting.
  5. Gegevensopslag: database gehost door Occentus Networks (EU)
  6. Rechten: u kunt uw gegevens op elk moment beperken, herstellen en verwijderen.

  1.   Tijdelijke afbeelding voor Alvaro Ortiz zei

    Ugh ... een beetje verwarrend.

  2.   tonic zei

    * / 30 ontbreekt (in het minutenveld) dat elke 30 minuten draait ...

    1.    erm3nda zei

      Ik wilde hier alleen commentaar op geven totdat ik besloot de opmerkingen te bekijken 😀
      Deze modifier is een heel belangrijk stuk informatie en iets heel nuttigs.

      1.    Kika zei

        Hello!
        Op dit moment test ik elke 45 minuten een configuratie.

        * / 45 * * * *, en de instructie wordt uitgevoerd op 45 minuten van elk uur EN elk uur. Het is te zeggen:

        Het draait om 3:45, dan 4:00, 4:45, dan 5:00, 5:45, 6:00, 6:45, enzovoort.

        Ik heb iets mis? Wat kan ik doen om het maar elke 45 minuten te maken, of minstens één keer per 45 minuten per uur.

    2.    Kika zei

      Hello!
      Op dit moment test ik elke 45 minuten een configuratie.

      * / 45 * * * *, en de instructie wordt uitgevoerd op 45 minuten van elk uur EN elk uur. Het is te zeggen:

      Het draait om 3:45, dan 4:00, 4:45, dan 5:00, 5:45, 6:00, 6:45, enzovoort.

      Ik heb iets mis? Wat kan ik doen om het maar elke 45 minuten te maken, of minstens één keer per 45 minuten per uur.

  3.   Speling zei

    Hallo super handig de informatie om te verduidelijken hoe cron werkt.
    Bytes

  4.   Speling zei

    voor *

  5.   Jager zei

    Uitstekend, bedankt voor het verduidelijken hoe cron werkt .. laten we een klein handje opsteken 🙂

  6.   Jakob zei

    Deze regel zal, zoals ik begrijp, om 10:15 uur worden uitgevoerd, corrigeer me als ik het mis heb
    Nou, daar staat 10:15 uur
    15 22 * * * gebruiker /home/user/scripts/update.sh

  7.   Agustin zei

    Hallo! zeer goede info.
    Om elk half uur een Script uit te voeren, zou de regel die aan CronTab moet worden toegevoegd zijn: "30 * * * * root Scrip.sh" Correct? Hartelijk bedankt!

  8.   laten we linux gebruiken zei

    Nee. Als ik het me goed herinner, moet je daarvoor / 30 * * * * root Scrip.sh invoeren.
    Dat wil zeggen, voeg de / vóór 30 toe.
    Proost! Paul.

  9.   Jonathan zei

    Hallo, ik vond je bericht leuk, het is erg compleet, maar ik wilde je iets vragen.
    Ik heb problemen met dit commando en een zoals "at".

    Ik wil op een bepaald moment een script draaien en zetten

    op -f /home/mi_user/Desk/script.sh 18:08 voorbeeld

    en het script wordt niet uitgevoerd op het scherm, dat wil zeggen in de terminal, wordt het op de achtergrond uitgevoerd?

    En met cron gebeurt hetzelfde met mij, ik bewerk het crontab-bestand met "crontab -e"

    aan het einde voeg ik deze regel toe:

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

    en het doet niets, het toont het script niet.

    Enige suggestie? Hartelijk dank en excuses voor het eventuele ongemak

    1.    laten we linux gebruiken zei

      Om de terminal te laten verschijnen, moet u mogelijk de terminal uitvoeren en het script als parameter doorgeven.

      Bijvoorbeeld:

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

      De te gebruiken parameter kan variëren, afhankelijk van de terminalemulator die u gebruikt.

      Ik hoop dat het werkt.

      Knuffel! Paul.

  10.   patrecas zei

    De bijdrage wordt gewaardeerd.

    10 punten !!

    hallo2!!

  11.   Rodolfo zei

    Heel erg bedankt, het heeft me veel geholpen om sommige dingen te verduidelijken, totale dank, voor meer details of vragen ga ik naar de MAN-PAGINA, herhaalde groeten.

  12.   Jahir zei

    Oom, heel erg bedankt, ik heb de voorbeelden gelezen en getest. heel erg bedankt ... het is heel begrijpelijk. Proost

  13.   Geovanni zei

    Ik heb ubuntu Server 12.04.2 LTS gebruikt, en de versie van crontab die ik heb, om de lijst met de taken van de gebruiker te verwijderen, crontab -r (en -l, zoals deze handleiding zegt). Natuurlijk is het een kwestie van versies.

    Aan de andere kant heb ik ooit alleen crontab uitgevoerd en met dit soort kon ik mijn eigen executiebestand maken, maar dit was niet het bestand dat werd uitgevoerd. Degene die wordt uitgevoerd, is die in / etc / crontab. misschien zal iemand de opmerking gebruiken.

    PS (ik zocht met lokaliseren en whereis crontab maar het retourneerde alleen het bovengenoemde adres en een ander bestand dat gecodeerd is, dus als degene die werd uitgevoerd die was in / etc / crontab, maar bij het uitvoeren van het crontab -e commando, zou de mijne verschijnen met alle banen die ik had gedefinieerd) waar werd dit bestand opgeslagen '???? Vriendelijke groeten. Ik log altijd in met root.

  14.   Sebastian zei

    Uitstekend, erg handig !!!

  15.   mmm zei

    Hallo, ik zou dit willen doen ………… «15 10 * * * root ifdown eth0»

    dat wil zeggen dat op een bepaald moment de netwerkkaart is uitgeschakeld ………… nou, ik heb hem in de crontab gestopt en het werkte niet …… .. hoe gaat het?

    Saludos y gracias

  16.   Miguel zei

    Je hebt de definitie van 'mon' gemist na de titel 'Taken toevoegen aan crontab'

    Het artikel is nog steeds leuk, cron is buitengewoon handig.

  17.   Oscar zei

    Hoe gaaf was dat goede bericht, vraag het mij
    Als ik de records wil bijhouden die zijn achtergelaten door de uitvoering van taken, waar kan ik die dan zien?

    is decdir Ik wil de geschiedenis zien van de acties die in het verleden van dit bestand zijn ondernomen en ik wil zien wie het heeft gewijzigd en de datum

    bedankt

  18.   oscar zei

    Ik wil de wijzigingsgeschiedenis hiervan controleren

    Hoe kan ik het doen

    bedankt

  19.   Andres Ledo zei

    Goedemorgen,

    Ik denk dat je in het ubuntu-script een fout hebt gemaakt, je hebt ap-get -y upgrade geplaatst in plaats van apt-get -y upgrade. (Je hebt een t achtergelaten).

    Een groet.

    1.    laten we linux gebruiken zei

      Zo is. Dank je!
      Knuffel! Paul

  20.   Gabriel zei

    Ik wil weten hoe ik een cron-bestand moet maken om de tijd te kunnen specificeren wanneer het wordt uitgevoerd, de map, enz.

  21.   Valentin zei

    Bedankt voor het verduidelijken van de werking en de basisopdrachten voor cron, nu om jezelf een tijdje te vermaken.

  22.   Sander zei

    Telkens wanneer ik informatie zoek over een onderwerp gerelateerd aan Gnu / Linux, ga ik rond en rond om altijd in 90% van de gevallen de beste tutorial in deze geweldige gemeenschap te vinden, ik denk dat ik vanaf nu hier en dan ergens anders zal beginnen.

    groeten

    1.    laten we linux gebruiken zei

      Bedankt Sander! Een knuffel! Paul.

  23.   dario zei

    dom = dag van de maand
    dow = dag van de week
    het is gemakkelijker als je associeert

  24.   Paas- zei

    Heel erg bedankt, heel compleet en goed uitgelegd.

  25.   Maxilla zei

    Dit is hetzelfde dat mijn leraar Besturingssystemen ons gaf, ik verander niets, nu begrijp ik waarom de klas zo slecht is. - Nou, dit is hetzelfde als huiswerk xD

  26.   Marcelo zei

    Geschatte,

    Vraag, kan de duur van een taak worden beperkt?
    Ik heb bijvoorbeeld een taak die zich elke 5 minuten herhaalt, bij herhaling als die taak nog steeds actief is, laat hem deze doden en opnieuw uitvoeren.

    Dank je wel,
    Marcelo. -

    1.    laten we linux gebruiken zei

      Hallo, Marcelo!

      Ik denk dat het beter zou zijn als u deze vraag stelt in onze belde vraag- en antwoorddienst Vragen DesdeLinux zodat de hele gemeenschap u kan helpen met uw probleem.

      Een knuffel, Pablo.

  27.   aj zei

    goede post.
    Wat is het commando per terminal om taken toe te voegen aan de crontab (zonder de crontab in te voeren en ze handmatig toe te voegen met 'crontab -e' of de crontab te vervangen door een andere crontab met 'crontab-bestand').
    Het idee is om een ​​extern script te maken om de taken aan de crontab toe te voegen
    bedankt

    1.    david zei

      het lijkt mij dat je 'echo' kunt gebruiken wat je maar wilt toevoegen '| cat >> 'cronotab path (/ etc / cronotab)' «

  28.   Raphael Vera zei

    Hoe zou een uitdrukking precies elke 3 dagen worden uitgevoerd?

  29.   Jose Antonio zei

    Hey.

    Ik heb een probleem met het uitvoeren van een cron-taak.

    Ik voer de volgende taak uit met cronta -e:

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

    maar de taak is niet volbracht. Ik heb gecontroleerd of myfile.sh uitvoerrechten heeft en dat de gebruiker die het uitvoert root is.

    Ik voer dezelfde taak uit in / etc / crontab en na het herstarten van de service, werkt het ook niet voor mij.
    De inhoud van myfile.sh is een commando dat een database bijwerkt en als ik het in de console uitvoer, werkt het.
    enig idee wat het probleem kan zijn?

    1.    Freddy zei

      De databasegebruiker heeft mogelijk niet alle rechten en u moet eerst de omgevingsvariabelen uit uw database-engine exporteren.
      In db2 zou deze regel bijvoorbeeld naar het begin van het script gaan
      . / home / db2inst1 / sqllib / db2profile

      Een andere oorzaak kan zijn dat het script verbinding met de database vereist, maak de verbinding met de database binnen het script

  30.   LA3 zei

    Ik wist niet dat ik de crond opnieuw moest starten, ik had hier al een tijdje mee gevochten

  31.   Kenia zei

    Ze zullen weten hoe ze moeten aangeven dat de taak elk einde van de maand wordt uitgevoerd, op het aangegeven tijdstip .. het detail is dat ik niet kan bereiken hoe ik weet dat het de laatste dag van elke maand duurt .. ??? Ik moest ze een voor een opschrijven, maar als het einde van de maand februari komt, wat biciesto is, wordt het ingewikkeld ...

  32.   Jezus zei

    goede dag!!

    Hoe stop ik het proces dat wordt uitgevoerd in de crontab?

  33.   Jezus zei

    werkwijze * …………

  34.   Julianna zei

    Zou het kunnen dat u mij kunt helpen? eu tenho um script door minha authored dat niet werkt no crontab! Já dei alle toestemmingen, niet een specifieke cron of gebruiker die het kan uitvoeren - er gebeurt bijna niets! Ik zou graag willen weten of je me kunt helpen, sommige andere dingen werken no cron! Vlws

  35.   Anthox zei

    Hoe zou u een taak elke laatste dag van de maand laten uitvoeren (dagen: 31-30-28)?

  36.   tfercho zei

    Zoals je al weet, wordt het su commando gebruikt om van gebruiker te veranderen in een console. Als ik het commando su zo gebruik: "jouw gebruiker" verander gebruiker maar zonder de juiste instellingen van "gebruiker", als ik su draai als: "su - gebruiker" verander gebruiker laadt de gebruikersinstellingen. Met cron geef ik de gebruiker aan, maar hoe laad ik de configuraties van deze gebruiker?

  37.   Beroven zei

    En als ik het wil stoppen?

  38.   Regi zei

    Hallo,
    Ik weet niet wat ik verkeerd doe, maar ik volg de stappen en er wordt niets uitgevoerd. Ik heb geprobeerd:
    59 * * * * / usr / bin / gedit
    * * * * * / usr / bin / gedit
    * * * * * root / usr / bin / gedit
    * * * * * usr / bin / test.sh
    * * * * * root usr / bin / test.sh

    en helemaal niets. Het voert niets uit. Ik ben opnieuw opgestart en zo.

  39.   Ferqo's zei

    heel hartelijk bedankt