GNU/Linux >> Znalost Linux >  >> Linux

Jak používám cron v Linuxu

Jednou z výzev (mezi mnoha výhodami) práce správce systému je spouštění úloh, když byste raději spali. Některé úkoly (včetně pravidelně se opakujících úkolů) je například třeba spouštět přes noc nebo o víkendech, kdy se neočekává, že by nikdo používal počítačové zdroje. Nemám po večerech čas na spouštění příkazů a skriptů, které musí fungovat mimo pracovní dobu. A nechci, abych musel vstávat na nulu, tma-sto, abych spustil zálohu nebo velkou aktualizaci.

Místo toho používám dva obslužné programy, které mi umožňují spouštět příkazy, programy a úlohy v předem určených časech. cron a v služby umožňují správcům systému naplánovat spouštění úloh v konkrétní čas v budoucnu. At service určuje jednorázovou úlohu, která se spouští v určitou dobu. Služba cron může plánovat úkoly na opakující se bázi, například denně, týdně nebo měsíčně.

V tomto článku představím službu cron a jak ji používat.

Běžná (a neobvyklá) použití cronu

Používám cron službu pro plánování samozřejmých věcí, jako jsou pravidelné zálohy, ke kterým dochází denně ve 2 hodiny ráno. Používám ji také pro méně zřejmé věci.

  • Systémové časy (tj. čas operačního systému) na mnoha počítačích se nastavují pomocí protokolu NTP (Network Time Protocol). Zatímco NTP nastavuje systémový čas, nenastavuje hardwarový čas, který se může posunout. K nastavení hardwarového času na základě systémového času používám cron.
  • Mám také program Bash, který spouštím každé ráno brzy ráno a který na každém počítači vytváří novou „zprávu dne“ (MOTD). Obsahuje informace, jako je využití disku, které by měly být aktuální, aby byly užitečné.
  • Mnoho systémových procesů a služeb, jako je Logwatch, logrotate a Rootkit Hunter, používá službu cron k plánování úloh a spouštění programů každý den.

Krond daemon je služba na pozadí, která umožňuje funkčnost cronu.

Služba cron kontroluje soubory ve složce /var/spool/cron a /etc/cron.d adresáře a /etc/anacrontab soubor. Obsah těchto souborů definuje úlohy cron, které se mají spouštět v různých intervalech. Jednotlivé uživatelské soubory cron jsou umístěny v /var/spool/cron a systémové služby a aplikace obecně přidávají soubory úloh cron do /etc/cron.d adresář. Soubor /etc/anacrontab je speciální případ, který bude popsán později v tomto článku.

Použití crontab

Nástroj cron se spouští na základě příkazů zadaných v tabulce cron (crontab ). Každý uživatel, včetně uživatele root, může mít soubor cron. Tyto soubory ve výchozím nastavení neexistují, ale lze je vytvořit ve složce /var/spool/cron adresář pomocí crontab -e příkaz, který se také používá k úpravě souboru cron (viz skript níže). Důrazně vám doporučuji ne použijte standardní editor (jako je Vi, Vim, Emacs, Nano nebo jakýkoli z mnoha dalších dostupných editorů). Pomocí crontab nejenže umožňuje upravit příkaz, ale také restartuje crond démona, když uložíte a ukončíte editor. crontab příkaz používá Vi jako svůj základní editor, protože Vi je vždy přítomno (i na těch nejzákladnějších instalacích).

Nové soubory cron jsou prázdné, takže příkazy je třeba přidávat od začátku. Níže uvedený příklad definice úlohy jsem přidal do svých vlastních souborů cron, jen jako rychlou referenci, takže vím, co různé části příkazu znamenají. Neváhejte si jej zkopírovat pro vlastní potřebu.

# crontab -e
SHELL=/bin/bash
[email protected]
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed

# backup using the rsbu program to the internal 4TB HDD and then 4TB external
01 01 * * * /usr/local/bin/rsbu -vbd1 ; /usr/local/bin/rsbu -vbd2

# Set the hardware clock to keep it in sync with the more accurate system clock
03 05 * * * /sbin/hwclock --systohc

# Perform monthly updates on the first of the month
# 25 04 1 * * /usr/bin/dnf -y update

První tři řádky v kódu výše nastavují výchozí prostředí. Prostředí musí být nastaveno na cokoli, co je pro daného uživatele nezbytné, protože cron neposkytuje žádné prostředí. SHELL proměnná určuje shell, který se má použít při provádění příkazů. Tento příklad určuje prostředí Bash. MAILTO proměnná nastavuje e-mailovou adresu, na kterou se budou odesílat výsledky úlohy cron. Tyto e-maily mohou poskytovat stav úlohy cron (zálohy, aktualizace atd.) a sestávat z výstupu, který byste viděli, pokud byste program spouštěli ručně z příkazového řádku. Třetí řádek nastavuje PATH pro životní prostředí. I když je zde nastavena cesta, ke každému spustitelnému souboru vždy přidám plně kvalifikovanou cestu.

Ve výše uvedeném příkladu je několik řádků komentářů, které podrobně popisují syntaxi potřebnou k definování úlohy cron. Rozeberu tyto příkazy a poté přidám několik dalších, abych vám ukázal některé pokročilejší možnosti souborů crontab.

01 01 * * * /usr/local/bin/rsbu -vbd1 ; /usr/local/bin/rsbu -vbd2

Tento řádek spouští můj vlastní skript Bash shell, rsbu , která zálohuje všechny mé systémy. Tato práce začíná každý den v 1:01 (01 01). Hvězdičky (*) na pozicích tři, čtyři a pět časové specifikace jsou jako globus souborů nebo zástupné znaky pro jiná časová rozdělení; specifikují „každý den v měsíci“, „každý měsíc“ a „každý den v týdnu“. Tato linka spustí mé zálohy dvakrát; jeden se zálohuje na interní vyhrazený záložní pevný disk a druhý se zálohuje na externí USB disk, který si mohu vzít do bezpečnostní schránky.

Následující řádek nastavuje hardwarové hodiny počítače pomocí systémových hodin jako zdroje přesného času. Tato linka je nastavena na provoz každý den v 5:03 (03 05).

03 05 * * * /sbin/hwclock --systohc

K provedení dnf jsem používal třetí a poslední úlohu cron (okomentováno) nebo mňam aktualizace v 04:25 prvního dne každého měsíce, ale okomentoval jsem ji, takže již neběží.

# 25 04 1 * * /usr/bin/dnf -y update

Další triky pro plánování

Nyní pojďme udělat pár věcí, které jsou o něco zajímavější než tyto základy. Předpokládejme, že chcete spustit konkrétní úlohu každý čtvrtek v 15:00:

00 15 * * Thu /usr/local/bin/mycronjob.sh

Nebo možná budete muset spouštět čtvrtletní přehledy po skončení každého čtvrtletí. Služba cron nemá možnost „Poslední den v měsíci“, takže místo toho můžete použít první den následujícího měsíce, jak je uvedeno níže. (Předpokládá se, že data potřebná pro přehledy budou připravena, až bude úloha nastavena na spuštění.)

02 03 1 1,4,7,10 * /usr/local/bin/reports.sh

Níže je uvedena úloha, která běží o minutu později každou hodinu mezi 9:01 a 17:01

01 09-17 * * * /usr/local/bin/hourlyreminder.sh

Setkal jsem se se situacemi, kdy jsem potřeboval spustit úlohu každé dvě, tři nebo čtyři hodiny. Toho lze dosáhnout vydělením hodin požadovaným intervalem, například */3 každé tři hodiny nebo 6–18/3 jezdit každé tři hodiny mezi 6. a 18. hodinou. Ostatní intervaly lze rozdělit podobně; například výraz */15 v pozici minut znamená "spustit úlohu každých 15 minut."

*/5 08-18/2 * * * /usr/local/bin/mycronjob.sh

Jedna věc, kterou je třeba poznamenat:Aby se úloha mohla spustit, musí mít výrazy dělení za následek zbytek nula. Proto je v tomto příkladu úloha nastavena tak, aby se spouštěla ​​každých pět minut (08:05, 08:10, 08:15 atd.) během sudých hodin od 8:00 do 18:00, ale ne během žádné liché- číslované hodiny. Úloha například nepoběží vůbec od 21:00. do 9:59

Jsem si jistý, že na základě těchto příkladů můžete přijít s mnoha dalšími možnostmi.

Omezení přístupu cronu

Další zdroje pro Linux

  • Cheat pro příkazy Linuxu
  • Cheat sheet pro pokročilé příkazy systému Linux
  • Bezplatný online kurz:Technický přehled RHEL
  • Síťový cheat pro Linux
  • Cheat sheet SELinux
  • Cheat pro běžné příkazy pro Linux
  • Co jsou kontejnery systému Linux?
  • Naše nejnovější články o Linuxu

Běžní uživatelé s přístupem cron mohou dělat chyby, které mohou například způsobit zahlcení systémových zdrojů (jako je paměť a čas CPU). Aby se zabránilo možnému zneužití, může správce systému omezit přístup uživatelů vytvořením /etc/cron.allow soubor, který obsahuje seznam všech uživatelů s oprávněním vytvářet úlohy cron. Uživateli root nelze zabránit v používání cronu.

Tím, že zabráníte uživatelům bez oprávnění root ve vytváření jejich vlastních úloh cron, může být nutné, aby root přidal své úlohy cron do kořenového crontab. "Ale počkej!" říkáš. "Nespouští to ty úlohy jako root?" Ne nutně. V prvním příkladu v tomto článku lze pole uživatelského jména zobrazené v komentářích použít k určení ID uživatele, které má úloha mít při spuštění. To zabrání zadaným úlohám jiného uživatele než root ve spuštění jako root. Následující příklad ukazuje definici úlohy, která spouští úlohu jako uživatel "student":

04 07 * * * student /usr/local/bin/mycronjob.sh

Pokud není zadán žádný uživatel, úloha se spustí jako uživatel, který vlastní soubor crontab, v tomto případě root.

cron.d

Adresář /etc/cron.d je místo, kde některé aplikace, jako je SpamAssassin a sysstat, instalují soubory cron. Protože zde není žádný uživatel spamassassin nebo sysstat, tyto programy potřebují místo k nalezení souborů cron, takže jsou umístěny v /etc/cron.d .

Soubor /etc/cron.d/sysstat soubor níže obsahuje úlohy cron, které se týkají hlášení systémové aktivity (SAR). Tyto cron soubory mají stejný formát jako uživatelský cron soubor.

# Run system activity accounting tool every 10 minutes
*/10 * * * * root /usr/lib64/sa/sa1 1 1
# Generate a daily summary of process accounting at 23:53
53 23 * * * root /usr/lib64/sa/sa2 -A

Soubor cron sysstat má dva řádky, které provádějí úkoly. Na prvním řádku běží sa1 program každých 10 minut shromažďovat data uložená ve speciálních binárních souborech v /var/log/sa adresář. Potom každou noc ve 23:53 sa2 spustí se program a vytvoří denní souhrn.

Tipy pro plánování

Některé časy, které jsem nastavil v souborech crontab, se zdají spíše náhodné – a do jisté míry jsou. Pokus o naplánování úloh cronu může být náročný, zvláště když se počet úloh zvyšuje. Na každém ze svých počítačů mám obvykle naplánováno jen několik úkolů, což je jednodušší než v některých produkčních a laboratorních prostředích, kde jsem pracoval.

Jeden systém, který jsem spravoval, měl asi tucet úloh cron, které běžely každou noc, a další tři nebo čtyři, které běžely o víkendech nebo první den v měsíci. To byla výzva, protože pokud by současně běželo příliš mnoho úloh – zejména zálohování a kompilace –, systému by došla paměť RAM a téměř by se zaplnil odkládací soubor, což vedlo k tomu, že se systém rozbil, zatímco výkon klesl, takže se nic nedělalo. Přidali jsme více paměti a zlepšili způsob plánování úkolů. Také jsme odstranili úlohu, která byla velmi špatně napsaná a využívala velké množství paměti.

Služba crond předpokládá, že hostitelský počítač běží neustále. To znamená, že pokud je počítač vypnutý během období, kdy bylo naplánováno spuštění úloh cron, nespustí se až do příštího naplánování. To může způsobit problémy, pokud se jedná o kritické úlohy cronu. Naštěstí existuje další možnost pro spouštění úloh v pravidelných intervalech:anacron .

anacron

Program anacron provádí stejnou funkci jako crond, ale přidává možnost spouštět úlohy, které byly přeskočeny, například pokud byl počítač vypnutý nebo jinak nemohl spustit úlohu po dobu jednoho nebo více cyklů. To je velmi užitečné pro notebooky a další počítače, které jsou vypnuté nebo uvedené do režimu spánku.

Jakmile se počítač zapne a spustí, anacron zkontroluje, zda nakonfigurované úlohy nezmeškaly poslední naplánované spuštění. Pokud ano, spustí se tyto úlohy okamžitě, ale pouze jednou (bez ohledu na to, kolik cyklů bylo vynecháno). Pokud například týdenní úloha nebyla spuštěna po dobu tří týdnů, protože byl systém vypnut, když jste byli na dovolené, byla by spuštěna brzy po zapnutí počítače, ale pouze jednou, nikoli třikrát.

Program anacron poskytuje některé snadné možnosti pro spouštění pravidelně naplánovaných úloh. Stačí nainstalovat skripty do /etc/cron.[hodiny|denně|týdně|měsíčně] adresářů, podle toho, jak často je třeba je spouštět.

Jak to funguje? Sekvence je jednodušší, než se na první pohled zdá.

  1. Služba crond spouští úlohu cron specifikovanou v /etc/cron.d/0hourly .
# Run the hourly jobs
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
01 * * * * root run-parts /etc/cron.hourly

  1. Úloha cron zadaná v /etc/cron.d/0hourly provozuje run-parts program jednou za hodinu.
  2. součásti běhu program spouští všechny skripty umístěné v /etc/cron.hourly adresář.
  3. /etc/cron.hourly adresář obsahuje 0anacron skript, který spouští program anacron pomocí /etdc/anacrontab konfigurační soubor zobrazený zde.
# /etc/anacrontab: configuration file for anacron

# See anacron(8) and anacrontab(5) for details.

SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=45
# the jobs will be started during the following hours only
START_HOURS_RANGE=3-22
                                                               
#period in days   delay in minutes   job-identifier   command
1       5       cron.daily              nice run-parts /etc/cron.daily
7       25      cron.weekly             nice run-parts /etc/cron.weekly
@monthly 45     cron.monthly            nice run-parts /etc/cron.monthly

  1. Program anacron spouští programy umístěné v /etc/cron.daily jednou denně; spouští úlohy umístěné v /etc/cron.weekly jednou týdně a úlohy v cron.monthly jednou za měsíc. Všimněte si zadaných časů zpoždění na každém řádku, které pomáhají zabránit tomu, aby se tyto úlohy překrývaly samy sebe a jiné úlohy cron.

Místo umístění úplných programů Bash do cron.X adresářů, nainstaluji je do /usr/local/bin adresář, který mi umožňuje jejich snadné spouštění z příkazového řádku. Poté přidám symbolický odkaz do příslušného adresáře cron, například /etc/cron.daily .

Program anacron není navržen tak, aby spouštěl programy v určitých časech. Spíše je zamýšleno spouštět programy v intervalech, které začínají v určených časech, například ve 3:00 (viz START_HOURS_RANGE řádek ve skriptu těsně nad) každý den, v neděli (pro začátek týdne) a první den v měsíci. Pokud dojde k vynechání jednoho nebo více cyklů, anacron zmeškané úlohy jednou spustí, jakmile to bude možné.

Zkratky

Soubor/etc/anacrontab výše uvedený soubor nám ukazuje, jak můžeme používat zkratky pro několik konkrétních a běžných časů. Tyto jednoslovné časové zkratky lze použít k nahrazení pěti polí obvykle používaných k určení časů. @ znak se používá k identifikaci zkratek ke cronu. Níže uvedený seznam, převzatý z manuálové stránky crontab(5), ukazuje zkratky s jejich ekvivalentním významem.

  • @reboot :Spustit jednou po restartu.
  • @yearly :Běhejte jednou ročně, tzn. 0 0 1 1 *
  • @ročně :Běhejte jednou ročně, tzn. 0 0 1 1 *
  • @monthly :Spustit jednou za měsíc, tzn. 0 0 1 * *
  • @weekly :Běhejte jednou týdně, tzn. 0 0 * * 0
  • @daily :Běhejte jednou denně, tzn. 0 0 * * *
  • @hourly :Spusťte jednou za hodinu, tzn. 0 * * * *

Tyto zkratky lze použít v libovolném souboru crontab, například v /etc/cron.d .

Další informace o nastavení limitů

Většinu těchto metod používám pro plánování úloh, které se mají spouštět na mých počítačích. Všechny tyto úlohy musí být spuštěny s oprávněními root. Podle mých zkušeností je vzácné, že běžní uživatelé opravdu potřebují práci cronu. Jedním případem byl vývojářský uživatel, který potřeboval práci cron, aby mohl zahájit každodenní kompilaci ve vývojové laboratoři.

Je důležité omezit přístup k funkcím cron uživatelům bez oprávnění root. Existují však okolnosti, kdy uživatel potřebuje nastavit, aby se úloha spouštěla ​​v předem určených časech, a cron mu to může umožnit. Mnoho uživatelů nerozumí tomu, jak správně nakonfigurovat tyto úlohy pomocí cronu, a dělají chyby. Tyto chyby mohou být neškodné, ale častěji mohou způsobit problémy. Nastavením funkčních zásad, které způsobují interakci uživatelů se správcem systému, je mnohem méně pravděpodobné, že jednotlivé úlohy cronu budou narušovat ostatní uživatele a další systémové funkce.

Je možné nastavit limity na celkové zdroje, které lze přidělit jednotlivým uživatelům nebo skupinám, ale to je článek na jindy.

Pro více informací, manuálové stránky pro cron, crontab, anacron, anacrontab a run-parts všechny obsahují vynikající informace a popisy toho, jak systém cron funguje.

Tento článek byl původně publikován v listopadu 2017 a byl aktualizován, aby obsahoval další informace.


Linux
  1. Jak používat BusyBox na Linuxu

  2. Jak používat cron na Linuxu

  3. Jak používat Su Command v Linuxu

  1. Jak používat FIND v Linuxu

  2. Jak používat Unzip v Linuxu

  3. Jak používat Disk Google v systému Linux

  1. Jak používám nastavení usnadnění přístupu v systému Linux

  2. Jak používat pkgsrc na Linuxu

  3. Jak nastavit Cron Job v Linuxu