cron

Cron

Informace
Napsáno VS
Operační systém Unixový typ
Typ Obslužný program UNIX ( d )
Plánování úloh počítače
Daemon

cron je program, který umožňuje uživatelům unixových systémů automaticky spouštět skripty, příkazy nebo software v předem určeném datu a čase nebo v předem definovaném cyklu.

Původ

Koncept tohoto programu vzniklo v unixových systémech v Berkeley a AT & T , a byl později racionalizovat Paul Vixie . Původní myšlenkou bylo mít službu, která se probouzí každou minutu, analyzuje sadu souborů v konkrétním adresáři a odtud určuje, zda by takové příkazy shellu měly být provedeny během této doby.

Cron

Cron je zkrácení záložky cron , samotné zkrácení c h ron o tab le, což znamená „plánovací tabulka“ (v řečtině chronos (χρόνος) znamená čas).

Toto je velmi užitečná funkce pro rutinní úlohy správy systému , ale lze ji velmi dobře použít pro cokoli jiného. Například cron může hrát ogg soubor každý den v sedm hodin kromě soboty a neděle, aby se probudil k hudbě.

cron je démon , který v počítačovém žargonu označuje program, který běží na pozadí. Služba cron ( crond ) tak čeká, dokud čas uvedený v konfiguračním souboru (nazývaný crontab ) neprovede odpovídající akci a přejde zpět do režimu spánku až do další události.

Službu cron spouští účet root , aby se mohl přizpůsobit identitě každého uživatele. Na některých unixech, pokud je zabit (pomocí příkazu kill), je automaticky restartován systémem.

crontab

crontabje název programu pod Unixem (a Linuxem ), který umožňuje editovat konfigurační tabulky programu cron . Tyto tabulky specifikují úkoly, které mají být provedeny, a jejich plán provádění, případně s periodicitou. Rozšířením často nazýváme cron (nebo úlohu cron v angličtině) jakýkoli pravidelně spuštěný úkol.

Úkon

Příkaz crontabupraví soubor týkající se uživatele. Z důvodu bezpečnosti crontabpřed aktualizací souboru zkontrolujte syntaxi. Tento soubor je umístěn ve stromové struktuře /var , například:

Takže pro uživatele rootna Debianu bude cron tabulka uložena v/var/spool/cron/crontabs/root

Většina systémů Linux (SuSE, Debian, Red Hat ) má také centralizovanou cron tabulku /etc/crontab.

K dispozici jsou také záznamy /etc/cron.d, /etc/cron.hourly, /etc/cron.daily, /etc/cron.weeklya /etc/cron.monthlykteré obsahují cron tabulky různých částí systému (rotace log, aktualizační soubory ...).

U pracovních stanic, které nemusí nutně fungovat 24 hodin denně, umožňuje aplikace anacron spouštět příkazy, které by měly být, když byl počítač vypnutý.

použití Čtení tabulky

Následující příkazový řádek zobrazuje obsah tabulky cron pro aktuálního uživatele:

$ crontab -l

Tento příkaz nezobrazuje centralizovanou tabulku ( /etc/crontab).

Úpravy tabulky

Následující příkaz se používá k úpravě tabulky cron pro aktuálního uživatele:

$ crontab -e

Tento příkaz má za následek spuštění výchozího editoru (obecně vi). Editor poté zobrazí aktuální tabulku. Při prvním spuštění crontabje tabulka prázdná, případně vytvořená z komentářů nápovědy (řádky začínající znakem #).

Výchozí editor se konfiguruje pomocí proměnných prostředí $EDITORnebo $VISUAL. Například pro konfiguraci editoru vim :

$ export EDITOR=vim

Tento příkaz také neumožňuje upravit centralizovanou tabulku ( /etc/crontab).

Výměna stolu

crontabmůžete také přepsat aktuální tabulku novou. Tato nová tabulka může být poskytnuta v souboru jako parametr:

$ crontab fichier-contenant-la-nouvelle-table.txt Mazání tabulky

Následující příkazový řádek odstraní bez potvrzení obsah cron tabulky pro aktuálního uživatele:

$ crontab -r Syntaxe tabulky Hodnocení

Každá položka v tabulce (každý řádek) odpovídá úkolu, který má být proveden, a musí respektovat tento zápis:

mm hh jj MMM JJJ tâche
  • mm představuje minuty (od 0 do 59)
  • hh představuje hodinu (od 0 do 23)
  • dd představuje číslo dne v měsíci (od 1 do 31)
  • MMM představuje zkratku názvu měsíce (leden, únor, ...) nebo čísla měsíce (od 1 do 12)
  • JJJ představuje zkratku názvu dne nebo čísla dne v týdnu:
    • 0 = neděle
    • 1 = pondělí
    • 2 = úterý
    • ...
    • 6 = sobota
    • 7 = neděle (zobrazeno dvakrát pro oba typy týdne )

Pro každou číselnou hodnotu ( mm , hh , jj , MMM , JJJ ) jsou možné notace:

  • *  : pro každou jednotku (0, 1, 2, 3, 4 ...)
  • 5.8  : jednotky 5 a 8
  • 2-5  : jednotky od 2 do 5 (2, 3, 4, 5)
  • * / 3  : každé 3 jednotky (0, 3, 6, 9 ...)
  • 10-20 / 3  : každé 3 jednotky, mezi desátou a dvacátou (10, 13, 16, 19)

Pokud jsou na stejném řádku zadány „číslo dne v měsíci“ a „den v týdnu“, pak cron provede úlohu, když se jedno z polí shoduje. Například následující řádek označuje, že úkol by měl být proveden v pátek i 13. každého měsíce o půlnoci:

0 0 13 * 5 tâche Provozní protokol

Úkol je příkaz, který se má provést. Pokud tato úloha zapíše na svůj standardní výstup nebo standardní chybu , démon crond je odešle e-mailem příslušnému uživateli (tomu, který je označen šestým parametrem).

Aby se zabránilo přenosu těchto informací e-mailem, je možné je přesměrovat do souborů. Například :

mm hh jj MMM JJJ tâche > fichier-1 2> fichier-2
  • fichier-1 bude obsahovat standardní výstup
  • fichier-2 bude obsahovat standardní chybu

Nebo hromadit standardní výstupy a chyby ve stejném souboru s názvem journal.txt  :

mm hh jj MMM JJJ tâche >> /mon/répertoire/journal.txt 2>&1 Klávesové zkratky
Klávesové zkratky Popis Ekvivalent
@reboot Při bootování Ne
@yearly Každý rok 0 0 1 1 *
@annually Každý rok 0 0 1 1 *
@monthly Každý měsíc 0 0 1 * *
@weekly Každý týden 0 0 * * 0
@daily Každý den 0 0 * * *
@midnight Každou noc 0 0 * * *
@hourly Každou hodinu 0 * * * *
Příklady

Každý z příkladů šetří volné místo na disku (příkaz df ) do souboru /tmp/df.logv různých časech. Aby byla zachována historie, používají tyto příklady přesměrování, >>které umožňuje přidat nová data na konec souboru (pokud tento již existuje, jinak bude vytvořen).

Každý den v 23:30:

30 23 * * * df >> /tmp/df.log

Každou hodinu od 5 minut:

5 * * * * df >> /tmp/df.log

Každý první v měsíci ve 23  h  30  :

30 23 1 * * df >> /tmp/df.log

Každé pondělí ve 22  h  28  :

28 22 * * 1 df >> /tmp/df.log

Každý pátek a všech 13 kteréhokoli měsíce v 11  hodin  22  :

22 11 13 * 5 df >> /tmp/df.log

Každý pátek 13. každého měsíce v 11  hodin  22  :

22 11 13 * * [ `date '+\%w'` -eq 5 ] && df >> /tmp/df.log

Od 2 do 5 každého měsíce v 10  hodin  12  :

12 10 2-5 * * df >> /tmp/df.log

Každý lichý den v měsíci ve 23  h  59  :

59 23 */2 * * df >> /tmp/df.log

Každý pracovní den v 22:00:

0 22 * * 1-5 df >> /tmp/df.log

Každých 5 minut:

*/5 * * * * df >> /tmp/df.log

Každý poslední den v měsíci (zpětné lomítko před% je povinné při úpravách crontabu, na rozdíl od ručního provádění příkazu):

0 0 28-31 * * [ `/bin/date +\%d` -gt `/bin/date +\%d -d "1 day"` ] && df >> /tmp/df.log  
  • Každou poslední neděli v měsíci:
    • První řešení: porovnejte každou neděli s neděli následujícího týdne.
0 0 * * 0 [ `/bin/date +\%d` -gt `/bin/date +\%d -d "7 day"` ] && df >> /tmp/df.log
    • Druhé řešení: otestujte poslední týden každý měsíc.
0 0 25-31 1,3,5,7,8,10,12 0 my-script.sh 0 0 24-30 4,6,9,11 0 my-script.sh 0 0 22-29 2 0 my-script.sh
    • Třetí řešení: Spusťte skript s kalendářem.
0 0 21-31 * * /bin/script.sh $ cat /bin/script.sh $ cat /bin/script.sh #!/bin/sh #(Pour les OS où `cal -m` met lundi en position 1) #dernierdimanche=`cal -m | awk '{print $7}' | tail -1`; #(ERREUR lignes vides si $7="") #CORRECTIF pour tous les OS dernierdimanche=`cal -m |awk 'BEGIN{p=7};(NR==2 && $1=="di"){p=1};(NF>=p){di=$p};END{print di};'`; aujourdhui=`date +%d` if [ $aujourdhui -eq $dernierdimanche ] then df >> /tmp/df.log else echo "Nous ne sommes pas encore le dernier dimanche du mois." fi  
    • Čtvrté řešení, použijte fcron .
  • Každou první neděli v měsíci:
    • První řešení: test každou neděli:
0 0 * * 0 [ `date '+\%e'` -le 7 ] && df >> /tmp/df.log
    • Další řešení: skript s kalendářem:
0 0 1-7 * * /bin/script2.sh $ cat /bin/script2.sh $ cat /bin/script2.sh #!/bin/sh #premierdimanche=`cal -m | awk '{print $7}' | head -3 | tail -1`; #(ERREUR si lundi "") premierdimanche=`cal -m | awk '(NR==3){print $NF}'`; #(CORRECTIF simple, pour lundi en position 1) aujourdhui=`date +%d` if [ $aujourdhui -eq $premierdimanche ] then df >> /tmp/df.log else echo "Nous ne sommes pas encore le premier dimanche du mois." fi   Časové razítko výstupního souboru

Výše uvedené příklady používají přesměrování >>k vytvoření protokolu napříč několika běhy.

Aby bylo možné zapisovat do různých souborů, je možné použít příkaz date, jako v následujícím příkladu:

30 23 * * * df > /tmp/df_`date +\%d_\%m_\%Y_\%H_\%M`.log

(znak `(těžký přízvuk, U + 0060) je vytvořen kombinací kláves [ Alt Gr] + [7] na klávesnici AZERTY ve Francii)

Dalším řešením je samozřejmě zápis souboru do skriptu appelle-df.sh :

#!/bin/sh JJ_MM_ANNEE_HH_MM=`date +\%d_\%m_\%Y_\%H_\%M` df > /tmp/df_${JJ_MM_ANNEE_HH_MM}.log

A nahraďte předchozí cron tabulku:

30 23 * * * appelle-df.sh Užitečné příkazy

Tyto příkazy nefungují pro všechny distribuce Linux a Unix .

Určuje čas posledního úkolu provedeného pro všechny uživatele:

ls -lut /etc/init.d/cron

Extrahujte informace o tabulce cron ze systémového protokolu:

grep -w cron /var/log/syslog

Znovu spusťte démona cron:

/etc/init.d/cron force-reload

Časové změny

Když se změní zimní / letní čas, změní se oficiální čas od 2:00 do 3:00 (podle pravidel platných ve Francii). Tyto úkoly naplánovány v rozmezí od 2 hodin a 00 2 59 proto nebude provedena. Naopak, během změny letního / zimního času budou tyto stejné úkoly prováděny dvakrát (ve 3 hodiny ráno, stále jsou 2 hodiny ráno).

Aby se předešlo těmto nepříjemnostem, je většina systémů Unix nakonfigurována tak, aby používala koordinovaný světový čas (UTC), na který se tato pravidla letního času nevztahují.

GNU mcron

mcron není správná implementace uvedeného programu, ale hlavní vývoj kódovaný v jazyce Scheme . Podporuje nejen tradiční metodu , ale také konfigurační soubory napsané ve Schématu, což mu dává určitou flexibilitu při definování úkolů, které mají být prováděny (může například brát v úvahu zatížení systému ). Novinka vychází ze schopnosti přečíst všechny požadované pokyny, zpracovat ty, které je třeba provést dále, a usnout v určeném čase. Když se probudí, příkazy se provedou a vypočítá se čas dalšího ošetření. Specifikace tohoto nového programu jsou psány v jazyce z rodiny Lispů , který umožňuje současné zpracování více instrukcí a větší flexibilitu než formát souboru Vixie . Nemluvě o tom, že změny provedené v souborech uživatelů crontabs jsou přímo hlášeny programem crontab , zatímco cron musí každou minutu kontrolovat / etc / crontab, i když použití tohoto souboru je silně odrazováno a lze jej deaktivovat. Jedná se o bezplatný software distribuovaný projektem GNU za podmínek licence GPL .

Zdroj

Některé části tohoto článku nebo dřívější verze tohoto článku jsou založeny na článku Web Plánovací úkoly Jak to funguje . Původní článek nese následující upozornění na autorská práva: „© Copyright 2004 Jean-François Pillou - hostitelem Web-solutions.fr. Tento dokument z webu CommentCaMarche.net podléhá licenci GNU FDL . Můžete kopírovat, upravovat kopie této stránky, pokud bude tato poznámka jasně vidět. ". Od té doby tento web Jak to funguje? změnil svůj průkaz. A konečně původní článek již není k dispozici.

Poznámky a odkazy

  1. Seznam zkratek Unix
  2. nebo možná odvozeno z chronografu ( „  Konfigurace úloh cron  “ , na Drupal.org (konzultováno 27. července 2007 )  : „Cron, což je zkratka pro chronograf (...)“ ), nebo z Command Run On ( Cron )
  3. Definováno proměnnou prostředí $EDITORnebo$VISUAL
  4. (in) Cron job - vykonat každou první neděli každého měsíce
  5. (en) „  GNU mcron  “ , na adresáři.fsf.org , FSF ,25. května 2014

Podívejte se také

Související články

externí odkazy

  • (en) Unixová manuálová stránka ( manuálová stránka )
    • (fr) Unixová manuálová stránka (francouzská
    manuálová stránka )
  • (on) Úvod do cronu
  • Plánování pravidelných úkolů: crontab na math-linux.com
  • Crontab pro figuríny