GNU/Linux >> Znalost Linux >  >> Linux

Plánování pomocí cron &At

Úvod

Jednou z výzev (mezi mnoha výhodami) být správcem systému je spouštění úkolů, když byste raději spali. Například některé úlohy (včetně pravidelně se opakujících úloh) musí běžet přes noc nebo o víkendech, kdy nikdo neočekával, že bude využívat 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-stovka, 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ě.

1. Cron

cron je softwarový nástroj nabízený operačním systémem podobným Linuxu, který automatizuje naplánovanou úlohu v předem určený čas. Jde oproces démona , který běží jako proces na pozadí a provádí zadané operace v předdefinovaný čas, kdy je spuštěna určitá událost nebo podmínka bez zásahu uživatele. Často se opakující úloha je pro správce systému zastrašující, a proto může naplánovat automatické spouštění takových procesů na pozadí v pravidelných časových intervalech vytvořením seznamu těchto příkazů pomocí cronu .

Umožňuje uživatelům provádět naplánovanou úlohu pravidelně a nenápadně, jako je zálohování každý den o půlnoci, plánování aktualizací na týdenní bázi, synchronizace souborů v určitých pravidelných intervalech. Cron opakovaně kontroluje naplánovanou úlohu a když pole naplánovaného času odpovídají polím aktuálního času, provedou se naplánované příkazy. Spouští se automaticky z /etc/init.d při vstupu do úrovní běhu pro více uživatelů.

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 v adresáři /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.

Jak používat cron v Linuxu

Není čas na příkazy? Plánování úloh pomocí cronu znamená, že programy mohou běžet, ale nemusíte zůstávat dlouho vzhůru.

Použití crontab

Obslužný program cron se spouští na základě příkazů zadaných v tabulce cron (crontab ). Každý uživatel, včetně root, může mít cron soubor. 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ů).

Crontab

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

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

Toto

line 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 globusy 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. (To předpokládá, že data potřebná pro sestavy 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 potřebuji 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 obdobně; například výraz */15 v pozici minut znamená „spustit úlohu každých 15 minut.“

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

Jedna věc k poznámce :Aby bylo možné úlohu spustit, musí výsledkem výrazů dělení být 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

Běžní uživatelé s přístupem cron mohou dělat chyby, které mohou například způsobit zahlcení systémových prostředků (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. Obvykle mám na každém ze svých počítačů 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.

Krond

služba 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 vykonává 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

počítač je zapnutý a spuštěný, 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í určen ke spouštění programů 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é skutečně potřebují práci cron. 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.

Důležité body

Syntaxe cronu:

cron [-f] [-l] [-L loglevel]

Možnosti:

  • -f : Používá se k udržení v režimu popředí a bez démonizace.
  • -l : Tím povolíte názvy souborů /etc/cron.d vyhovující LSB.
  • -n : Používá se k přidání FQDN do předmětu při odesílání e-mailů.
  • -L loglevel : Tato možnost řekne cronu, co má o úlohách protokolovat s následujícími hodnotami:
    • 1 : Zaznamená začátek všech úloh cronu.
    • 2: Zaznamená konec všech úloh cronu.
    • 4: Zaznamená všechny neúspěšné úlohy. Zde se výstupní stav nebude rovnat nule.
    • 8 : Zaznamená číslo procesu všech úloh cron.

Crontab (zkratka pro „cron table“) je seznam příkazů pro provádění naplánovaných úloh v konkrétní čas. Umožňuje uživateli přidávat, odebírat nebo upravovat naplánované úlohy. Syntaxe příkazu crontab má šest polí oddělených mezerou, kde prvních pět představuje čas spuštění úlohy a poslední je pro příkaz.

  • minuta (uchovává hodnotu mezi 0–59)
  • Hodina (udržuje hodnotu mezi 0–23)
  • Den v měsíci (udržuje hodnotu mezi 1–31)
  • Měsíc v roce (má hodnotu mezi 1.–12. nebo lednem–prosinec, použijí se první tři písmena názvu měsíce)
  • Den v týdnu (uchovává hodnotu mezi 0-6 nebo Ne-So, zde se také použijí první tři písmena dne)
  • Příkaz
Pravidla, kterými se řídí formát pole data a času takto:
  • Pokud je některé z prvních pěti polí nastaveno na hvězdičku (*), znamená to všechny hodnoty pole. Chcete-li například provádět příkaz denně, můžeme do pole týdne vložit hvězdičku (*).
  • Lze také použít řadu čísel oddělených pomlčkou (-) v poli času a data, aby bylo možné zahrnout více než jednu souvislou hodnotu, ale ne všechny hodnoty pole. Například můžeme použít 7-10 ke spuštění příkazu od července do října.
  • Operátor čárka (, ) se používá k zahrnutí seznamu čísel, která mohou, ale nemusí být po sobě jdoucí. Například „1, 3, 5“ v poli týdnů znamená provedení příkazu každé pondělí, středu a pátek.
  • Pro přeskočení daného počtu hodnot je zahrnut znak lomítka (/). Například „*/4“ v poli hodiny určuje „každé 4 hodiny“, což odpovídá 0, 4, 8, 12, 16, 20.
Povolení uživatelům spouštět úlohy cron:
  • Uživatel musí být uveden v tomto souboru, aby mohl spouštět úlohy cron, pokud soubor existuje.
/etc/cron.allow
  • Pokud soubor cron.allow neexistuje, ale soubor cron.deny existuje, pak uživatel nesmí být v tomto souboru uveden, aby mohl spustit úlohu cron.
/etc/cron.deny

Poznámka: Pokud žádný z těchto souborů neexistuje, bude moci daný příkaz použít pouze superuživatel (správce systému).
Ukázkové příkazy:

  • /home/folder/gfg-code.sh každou hodinu, od 9:00 do 18:00, každý den.
00 09-18 * * * /home/folder/gfg-code.sh
  • /usr/local/bin/backup ve 23:30, každý pracovní den.
30 23 * * Mon, Tue, Wed, Thu, Fri /usr/local/bin/backup
  • Spusťte sample-command.sh v 7:30, 9:30, 13:30 a 15:30.
30 07, 09, 13, 15 * * * sample-command.sh

Při práci s cronem byste měli mít na paměti následující body:

  • Mějte ovládací prvek zdrojové verze pro sledování a údržbu změn výrazů cron.
  • Uspořádejte naplánované úlohy podle jejich důležitosti nebo frekvence a seskupte je podle akce nebo časového rozsahu.
  • Otestujte naplánovanou úlohu tak, že budete mít zpočátku vysokou frekvenci.
  • Nepište složitý kód nebo několik kanálů a přesměrování přímo do výrazu cron. Místo toho je zapište do skriptu a naplánujte skript na kartu cron.
  • Pokud se často opakuje stejná sada příkazů, použijte aliasy.
  • Vyhněte se spouštění příkazů nebo skriptů přes cron jako uživatel root.

2. V

na příkaz je nástroj příkazového řádku, který se používá k naplánování spuštění příkazu v konkrétní čas v budoucnu. Úlohy vytvořené pomocí příkazu jsou prováděny pouze jednou. Příkaz at lze použít ke spuštění jakéhokoli programu nebo pošty kdykoli v budoucnu. Provádí příkazy v určitou dobu a přijímá časy ve tvaru HH:MM pro spuštění úlohy v určitou denní dobu. Následující výraz jako poledne, půlnoc, čas na čaj, zítra, příští týden, příští pondělí atd. lze použít s příkazem at command naplánovat úlohu.

Syntaxe:

at [OPTION...] runtime

Instalace at command

Pro Ubuntu/Debian:

sudo apt-get update
sudo apt-get install at

Pro CentOS/Fedora:

sudo yum install at

Práce s příkazem at

1. Příkaz k zobrazení seznamu čekajících úloh uživatele:

at -l

nebo

atq

2. Naplánujte si úlohu na nadcházející pondělí v čas o dvacet minut později, než je aktuální čas:

at Monday +20 minutes

3. Naplánujte spuštění úlohy na 12:45 srpna 2020:

at 1:45 081220

4. Naplánujte spuštění úlohy na 15:00 za čtyři dny:

at 3pm + 4 days

5. Naplánujte si úlohu vypnutí systému dnes ve 4:30:

# echo "shutdown -h now" | at -m 4:30

6. Naplánujte spuštění úlohy za pět hodin:

at now +5 hours

7. at -r nebo příkaz atrm se používá k odstranění úlohy, zde se používá k odstranění úlohy 11.

 at -r 11

nebo

atrm 11

Linux
  1. Plánování systémových úloh pomocí Cronu na Linuxu

  2. Synchronizujte čas serveru Linux se serverem času sítě

  3. Jak fungují vnitřnosti démona Cron?

  1. Plánování úloh pomocí linuxového příkazu cron

  2. Naplánujte si úlohu pomocí příkazu Linux at

  3. Plánování pravidelné akce:Cron/Cron alternativy (včetně celeru)

  1. Spravujte NTP pomocí Chrony

  2. Poprvé s Linuxem:30 instalačních příběhů

  3. Používáte Notify-Send s Cronem?