GNU/Linux >> Znalost Linux >  >> Linux

Pochopení Crontabu v Linuxu s příklady

Crontab se používá k automatizaci všech typů úloh v systémech Linux. Toto je obzvláště důležitá dovednost, kterou se musí naučit začínající správci systému. Začít může být poněkud náročné, pokud jste začátečník. Syntaxe se liší od většiny ostatních příkazů. Z tohoto důvodu bude tato lekce obsahovat trochu více základních informací, než vám ukážu některá použití.

Nenechte se crontabem zastrašit

Pro mě jako nováčka byl Crontab jedním z nejvíce zastrašujících linuxových konceptů. V době, kdy jsem se seznámil s ‚crontab‘, jsem používal příkazový řádek jen několik dní a stěží jsem rozuměl, jak používat základní příkazy pro navigaci v souborech jako ‚ls‘ a ‚cd‘.

Důvod, proč uvádím svou osobní historii učení, je ten, že očekávám, že mnoho nových uživatelů Linuxu se může cítit podobně ohromeni, když se podívají na jedinečnou syntaxi ‚crontab‘. Mohu vás však uklidnit, že to není tak složité, jakmile pochopíte, jak to funguje.

Co se v této příručce dozvíte

Chci vám rychle představit některé koncepty spojené s crontabem, aby bylo snazší je pochopit. Mým cílem je uvést tyto pojmy do kontextu a ilustrovat, jak spolu souvisí.

  • Rychlý úvod do pojmů Cron
  • Nastavte pro svůj uživatelský účet přístup Crontab
  • Ošetřete chyby ve svých cronjobech
  • Vytváření cronjobů

Rychlý úvod do klíčových pojmů cron

Dovolte mi, abych vás nejprve seznámil se základním konceptem „cronu“.

Rozdíl mezi Cron, Crontab a Cron Job

Vidět věci vizuálně pomáhá rychleji porozumět novým tématům. Zde je rozpis toho, jak se tato tři témata obecně ovlivňují. Potom každý popíšu podrobněji.

Prvek Název Linuxu Význam
Démon ‘crond’ Vyslovuje se „démon“ nebo „den-po“. Toto jsou systémové procesy na pozadí Linuxu.
Tabulka ‘crontab’ Řádky do této tabulky zapisujete při zadávání příkazu crontab. Každá hvězdička „*“ představuje segment času a odpovídající sloupec v každém řádku.
Zaměstnání Cron Job Konkrétní úkol, který má být proveden, popsaný v řádku, spárovaný s jeho určeným časovým id

Cronův stůl

Crontab znamená Cron Table. Toto je systémový soubor Linuxu, který vytváří strukturu podobnou tabulce, kde jsou pole oddělena mezerami. Uživatelé mohou naplnit tabulku přiřazením hodnot ke každému poli (hvězdička).

V celém článku bych mohl k popisu této myšlenky použít jiný jazyk. Aby bylo jasné, pole, buňka, sloupec atd. všechny odkazují na stejnou věc. Pokud to pomůže, můžete si svůj crontab představit jako mini-databázi.

Cron Job

Pokud nejste obeznámeni s databázemi, můžete si představit buňky v prázdném souboru aplikace Excel. Ať tak či onak, pro tuto analogii každá hvězdička představuje sloupec, jehož význam je definován jeho záhlavím. Posledním sloupcem bude volání příkazu nebo skriptu. Každý úplný řádek lze považovat za samostatnou práci. Často se o nich hovoří jako o „úkolech cron“, ačkoliv job, task atd. jsou všechny zaměnitelné termíny.

Démon Cron

Už jsme diskutovali o tabulce a o tom, jak ji naplňujeme pracovními místy. Ale jak se tyto práce vykonávají? Na pozadí našeho linuxového stroje běží systémový proces zvaný Daemon.

Existují démoni pro mnoho různých služeb. Ty jsou běžně pojmenovávány příponou „d“ k názvu služby.

Démon cron se přirozeně nazývá ‚crond‘. Ke spuštění tohoto démona není z naší strany vyžadována žádná akce, ale pokud si myslíte, že příkaz nepracuje správně, můžete pomocí příkazu ps ověřit, že je spuštěn „crond“.

ps aux | grep crond

Tento příkaz prohledá aktuální procesy pro všechny uživatele a vrátí všechny instance „crond“.

[email protected]:~$ ps ux | grep crond
christo+  8942  0.0  0.0  18612   840 pts/0    S+   02:16   0:00 grep --color=auto crond

Vidím, že démon běží pro můj uživatelský účet. Už jsem to věděl, protože jsem celý den zaplňoval soubor výstupem.

Vysvětlení syntaxe Crontab

Nyní, když máte vágní představu o tom, jak cron funguje, pojďme se podívat na syntaxi použití crontab. Doufám, že to bude méně matoucí, pokud si tyto informace dokážete představit jako tabulku ve své mysli.

crontab [options]

* * * * *  <command> 
OR 
* * * * * <path/to/script>

Slibuji, že se vám to podaří, jakmile zprovozníme náš vlastní příklad. Pojďme si znovu projít syntaxi pro úlohy cron.

Jak můžete vidět, syntaxe crontab má 5 hvězdiček. Zde je to, co každá z těchto hvězdiček představuje:

1. 2. 3. 4. 5.
* * * * *
ID minuta Hodina Datum-Datum Měsíc Název dne
Hodnoty 0–59 0–23 1–31 1–12 0–6

POZNÁMKA:Názvy dnů 0-6 začínají nedělí.

Chcete-li naplánovat úlohu, nahradíte příslušnou hvězdičku požadovanou hodnotou.

Pojďme si to rychle procvičit. Pokud máte crontab, jako je ten níže, kdy si myslíte, že se úloha spustí?

0 0 * * 0 

Otázka:Kdy bude příkaz spuštěn, pokud úlohu nastavíte tímto způsobem?

A. Každou hodinu od pondělí do soboty
B. Každou minutu v neděli
C. Pouze o půlnoci z pondělí na sobotu
D. Pouze o nedělní půlnoci

Odpověď je D. Spusťte „příkaz“ každou neděli v 00:00 [půlnoc].

Nastavení crontab cccess pro váš uživatelský účet

Crontab je specifický pro uživatele. Už jste se toho trochu dotkl. Pokud se domníváte, že existuje možnost, že jste crontab již dříve používali, můžete si to ověřit pomocí crontab -l .

[email protected]:~$ crontab -l
no crontab for christopher

[email protected]:~$ crontab -e
no crontab for christopher - using an empty one

Select an editor.  To change later, run 'select-editor'.
  1. /bin/nano        <---- easiest
  2. /usr/bin/code
  3. /bin/ed

Choose 1-3 [1]: 1

Když spustím tento příkaz, můžete vidět, že v tomto systému nemám žádný crontab.

Protože jsem ještě nevytvořil crontab, když používám -e pro úpravu tabulky mě vyzve k výběru preferovaného textového editoru. Nano se doporučuje jako nejjednodušší program. Můžete použít jakýkoli textový editor příkazového řádku, jako je Vim nebo Emacs. Je to opravdu na vás.

Pokud napoprvé neuspějete, sudo

Pokud se pokusíte použít crontab -e ale nezískáte tento výsledek, možná nemáte uživatelská oprávnění k vytvoření tabulky. Pokud máte přístup sudo, můžete použít sudo k nastavení crontab.

sudo crontab -e <your_username>

Váš systém automaticky načte váš crontab do správného umístění, které se může lišit v závislosti na distribuci, ale často je v adresáři jako /var/spool/cron/crontabs . Nepokoušejte se zde upravovat soubory.

Co se stane, když úloha cron narazí na chybu?

Výchozím chováním je odeslání výstupu e-mailem. Tato funkce je určena pro administrátory, kteří si mohou nechat automaticky zasílat protokoly na „místní“ e-mail v síťové doméně.

Pokud máte poštovní server, můžete si to nastavit sami. Existují také způsoby, jak automatizovat výstup e-mailů na GMail nebo podobné služby. Tyto metody však přesahují rámec tohoto článku.

Místo toho se podíváme na dva běžné způsoby, jak chybu obejít.

1) Odeslat výstup do souboru

Můžete určit soubor pro tento typ výstupu, do kterého se má odeslat, a poté použít >> k přesměrování výstupu.

Pomocí >> připojí informace k existujícímu souboru, zatímco jeden > symbol přepíše soubor. To je důležité vědět, pokud chcete udržovat velký soubor protokolu, který často aktualizuje záznamy. Oba automaticky vytvoří soubor, pokud neexistuje.

Příklad úlohy cron:

0 * * * *  echo "Linux is Cool!" >> ~/crontab_log.txt

2) Použijte /dev/null

Tím se obejde možnost e-mailu v podstatě smazáním dat. Standardní chyba („2“) a standardní výstup („1“) jsou odesílány do nulového souboru.

0 0 * * * echo "Why are you silencing me every night at midnight?" > /dev/null 2>&1

Možná jste si všimli, že pro příklady používám příkazy echo. Není pro to žádný konkrétní důvod, ale usnadňuje to ověření změn a „kontrola vaší práce“.

Pokud jste provedli nějaké programování, možná jste použili tiskové příkazy k otestování vaší logiky. Toto je stejný koncept.

Zkusme si nastavit vlastní cron job. Pokud jste si již „hráli“, je to skvělé. Pokud ne, nyní je čas připravit terminál a užít si zábavu.

Příklady Crontab:plánovací příkazy a skripty

Ukázal jsem vám několik příkladů, když jsem vysvětloval, jak je výstup směrován. Dávaly vám to smysl?

Dovolte mi projít prvním příkladem.

Minuta Hodina Datum-Datum Měsíc Název dne Příkaz
0 * * * * echo „Linux je cool!“>> ~/crontab_log.txt

Nastavení hodnoty minut na „0“ znamená, že příkaz bude spuštěn každou hodinu, v každou hodinu.

Pokročilé rozvrhy úloh

Můžete upravit více hodnot najednou. Pokud chcete, můžete nahradit všech 5 hvězdiček specifikacemi.

Minuta Hodina Datum-Datum Měsíc Název dne Příkaz
*/5 3–6 */5 */2 0,6 echo „Linux je cool!“>> ~/crontab_log.txt

Máte představu, co říká tento? V zájmu tohoto tutoriálu jsem tuto práci udělal obzvláště matoucí. Bylo by neobvyklé mít něco s tolika parametry „ve volné přírodě“, ale uvidíme, jestli to dokážete rozluštit. Pro něco takového rád pracuji pozpátku přes pole.

Zkusme to společně:

Pole Hodnota Význam
Název dne 0,6 Sobota a neděle
Měsíc */2 Každý měsíc, který je dělitelný 2 (sudými) měsíci.
Datum dne * Každé datum
Hodina 3–6 Mezi 3. a 6. hodinou ráno
Minuty */5 Každých 5 minut

V prostém jazyce:

Takže každý druhý měsíc, o víkendech, bez ohledu na datum, se tento příkaz spustí každých 5 minut mezi 3. a 6. hodinou ranní.

Páni, to bylo zamotané. Pokud jste to dokázali dodržet, jste připraveni pracovat s nejlepšími z nich.

Napište jednoduchý skript pro automatizaci cron pro zálohování souborů

Až do tohoto bodu dělaly úlohy cron, které jste napsali, jen jednu věc. To může být užitečné, ale možná budete chtít dělat více úkolů.

Naštěstí je to nejen možné, ale také velmi snadné. Pokud si pamatujete z původního příkladu syntaxe, můžete také použít cestu ke skriptu.

To se neomezuje pouze na bash, můžete také implementovat skript, který používá Python nebo Perl, pokud chcete.

Jaké jsou naše cíle?

  • Úlohy budou zpracovány každou noc ve 3:00
  • Zálohujte složku /Documents do souboru zip
  • Vygenerujte textový soubor se seznamem všeho v adresáři
  • Vytvořte archivní složku, která naklonuje náš záložní a textový soubor do podsložky s aktuálním datem

our_backup_script.sh

#! /bin/bash

DATE=$(date +%d-%m-%Y)
# Date in format DAY##-MONTH##-YEAR####

mkdir -p ~/archive/$DATE
# create a folder for today's date in the archive, if archive doesn't exist, make archive 
ls -al ~/Documents > ~/archive/$DATE/contents.txt
# create a text file listing the contents of the documents folder
cd ~/  && tar -cpzf $DATE.docs.backup.gz Documents/*
# change to parent directory to tar /Documents folder
cp ~/$DATE.docs.backup.gz ~/archive/$DATE/documents_archive.gz
# one .gz file is left in the home directory, a clone is sent to our archive under it's date
[email protected]:~$ ls
 Desktop     Downloads   Music                  Pictures   Public      Videos
 Documents   ENV         our_backup_script.sh   projects   Templates  'VirtualBox VMs'
[email protected]:~$ bash our_backup_script.sh 
[email protected]:~$ ls
 25-11-2019.docs.backup.gz   Documents   Music                  projects    Videos
 archive                     Downloads   our_backup_script.sh   Public     'VirtualBox VMs'
 Desktop                     ENV         Pictures               Templates
[email protected]:~$ ls archive/25-11-2019/
contents.all_files.txt  documents_archive.gz

Zbývá udělat tento skript jako cron.

crontab -e

A přidejte tam následující:

0 3 * * * bash ~/our_backup_script.sh

Byl ten váš úspěšný? Můj byl. Ve skutečnosti se mi ten nápad tak moc líbil, že bych si ho mohl nechat jako denní zálohu. Jednu úpravu, kterou provedu, je přesunout svůj archiv do složky na mém počítači, která se synchronizuje s cloudovým úložištěm.

Dalším způsobem plánování úloh v Linuxu je použití příkazu at. Možná by vás to také zajímalo.

Máte nějaké nápady na scénář, který byste mohli chtít vytvořit? Pomohl vám tento článek lépe porozumět crontab? Podělte se s námi v komentářích.


Linux
  1. Linux Tee Command s příklady

  2. Příkaz linuxové hlavy s příklady

  3. JQ Command v Linuxu s příklady

  1. wc Linux Command s příklady

  2. Linux řazení příkazů s příklady

  3. 6 Příklady příkazů Linux Crontab

  1. Echo Command v Linuxu (s příklady)

  2. man Command v Linuxu s příklady

  3. Příkaz AWK v Linuxu s příklady