107.2 Lecke 1
Tanúsítvány: |
LPIC-1 |
---|---|
Verzió: |
5.0 |
Témakör: |
107 Adminsztrációs feladatok |
Fejezet: |
107.2 A rendszerfelügyeleti feladatok automatizálása jobok ütemezésével |
Lecke: |
1/2 |
Bevezetés
Egy jó rendszergazda egyik legfontosabb feladata a rendszeresen végrehajtandó jobok ütemezése. A rendszergazda például létrehozhat és automatizálhat jobokat biztonsági mentésekhez, rendszerfrissítésekhez és sok más ismétlődő tevékenység elvégzéséhez. Ehhez használhatja a cron
lehetőséget, amely hasznos az időszakos jobok ütemezésének automatizálására.
Jobok ütemezése a Cron segítségével
A Linuxban a cron
egy olyan daemon, amely folyamatosan fut és percenként felébred, hogy ellenőrizzen egy sor táblázatot, hogy megtalálja a végrehajtandó feladatokat. Ezek a táblázatok crontabs néven ismertek, és az úgynevezett cronjobokat tartalmazzák. A cron olyan szerverekhez és rendszerekhez alkalmas, amelyek folyamatosan be vannak kapcsolva, mert minden egyes cronjob csak akkor hajtódik végre, ha a rendszer a tervezett időpontban fut. Használhatják a közönséges felhasználók, akiknek mindegyike rendelkezik saját `crontab'-bal, valamint a root felhasználó, aki a rendszer crontabjait kezeli.
Note
|
A Linuxban létezik az |
Felhasználói szintű crontabok
A felhasználói szintű crontabok (user crontab) olyan szöveges fájlok, amelyek a felhasználó által meghatározott cronjobok ütemezését kezelik. Nevüket mindig az őket létrehozó felhasználói fiók után kapják, de a fájlok helye a használt disztribúciótól függ (általában a /var/spool/cron
almappájában).
A felhasználói crontab minden sora hat, szóközzel elválasztott mezőt tartalmaz:
-
Az óra perce (0-59).
-
A nap órája (0-23).
-
A hónap napja (1-31).
-
Az év hónapja (1-12).
-
A hét napja (0-7, vasárnap=0 vagy vasárnap=7).
-
A futtatandó parancs.
Az év hónapjának és a hét napjának megadásához a név első három betűjét is használhatjuk a megfelelő szám helyett.
Az első öt mező azt jelzi, hogy mikor kell végrehajtani a hatodik mezőben megadott parancsot, és egy vagy több értéket tartalmazhat. Több értéket is megadhatunk a következőkkel:
*
(csillag)-
Bármilyen értékre vonatkozik.
,
(vessző)-
A lehetséges értékek listáját adja meg.
-
(kötőjel)-
Lehetséges értékek tartományát adja meg.
/
(perjel)-
Fokozatos értékek megadása.
Sok disztribúció tartalmazza az /etc/crontab
fájlt, amely referenciaként használható a cron
fájl elrendezéséhez. Íme egy példa a /etc/crontab
fájlra egy Debian telepítésből:
SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin # 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
Rendszerszintű crontabok
A rendszerszintű crontabok (system crontab) olyan szöveges fájlok, amelyek a rendszer cronjobjainak ütemezését kezelik, és csak a root felhasználó szerkesztheti őket. Az /etc/crontab
és az /etc/cron.d
mappában található összes fájl rendszer crontab.
A legtöbb disztribúció tartalmazza a /etc/cron.hourly
, /etc/cron.daily
, /etc/cron.weekly
és /etc/cron.monthly
mappákat is, amelyek a megfelelő gyakorisággal futtatandó scripteket tartalmazzák. Ha például naponta akarunk futtatni egy scriptet, akkor azt az /etc/cron.daily
mappában helyezhetjük el.
Warning
|
Egyes disztribúciók a |
A rendszerszintű crontabok szintaxisa hasonló a felhasználói crontabok szintaxisához, azonban egy további kötelező mezőre is szükség van, amely azt adja meg, hogy melyik felhasználó fogja futtatni a cronjobot. Ezért a rendszerszintű crontabok minden sora hét, szóközzel elválasztott mezőt tartalmaz:
-
Az óra perce (0-59).
-
A nap órája (0-23).
-
A hónap napja (1-31).
-
Az év hónapja (1-12).
-
A hét napja (0-7, vasárnap=0 vagy vasárnap=7).
-
A parancs végrehajtásakor használandó felhasználói fiók neve.
-
A futtatandó parancs.
A felhasználói crontabok esetében is több értéket adhatunk meg az időmezőkhöz a *
, ,
, -
és /
operátorok használatával. Az év hónapját és a hét napját a név első három betűjével is megadhatjuk a megfelelő szám helyett.
Különleges időspecifikációk
A crontab-fájlok szerkesztésekor az első öt oszlopban az időadatok helyett speciális gyorsbillentyűket is használhatunk:
@reboot
-
A megadott feladat futtatása újraindítás után, egyszer.
@hourly
-
A megadott feladat futtatása óránként egyszer, az óra elején.
@daily
(vagy@midnight
)-
A megadott feladat futtatása naponta egyszer, éjfélkor.
@weekly
-
A megadott feladat futtatása hetente egyszer, vasárnap éjfélkor.
@monthly
-
A megadott feladat futtatása havonta egyszer, a hónap első napján éjfélkor.
@yearly
(vagy@annually
)-
A megadott feladat futtatása évente egyszer, január 1-jén éjfélkor.
Crontab változók
A crontab fájlban lehetnek változó-hozzárendelések, amelyeket az ütemezett feladatok deklarálása előtt definiálunk. Az általában beállított környezeti változók a következők:
HOME
-
A mappa, ahonnan a
cron
a parancsokat hívja (alapértelmezés szerint a felhasználó home mappája). MAILTO
-
Annak a felhasználónak a neve vagy címe, akinek a standard kimenetet és a hibákat postázza (alapértelmezés szerint a crontab tulajdonosa). Több, vesszővel elválasztott érték is megengedett, az üres érték pedig azt jelzi, hogy nem kell levelet küldeni.
PATH
-
Az az útvonal, ahol a parancsok megtalálhatók.
SHELL
-
A használandó shell (alapértelmezés szerint
/bin/sh
).
Felhasználói szintű cronjobok létrehozása
A crontab
parancs az egyes felhasználók crontab fájljainak karbantartására szolgál. A crontab -e
parancsot használhatjuk a saját crontab fájlunk szerkesztésére, vagy létrehozására, ha még nem létezik.
$ crontab -e no crontab for frank - using an empty one Select an editor. To change later, run 'select-editor'. 1. /bin/ed 2. /bin/nano < ‑‑‑‑ easiest 3. /usr/bin/emacs24 4. /usr/bin/vim.tiny Choose 1-4 [2]:
Alapértelmezés szerint a crontab
parancs megnyitja a VISUAL
vagy EDITOR
környezeti változók által megadott szerkesztőt, így a crontab fájl szerkesztését a kívánt szerkesztővel kezdhetjük el. Egyes disztribúciók, mint a fenti példában is látható, lehetővé teszik, hogy a crontab
első futtatásakor egy listából kiválaszthassuk a szerkesztőt.
Ha minden nap 10:00-kor szeretnénk futtatni a home mappánkban található foo.sh
scriptet, akkor a következő sort kell hozzáadnunk a crontab fájlhoz:
0 10 * * * /home/frank/foo.sh
Nézzük meg az alábbi crontab bejegyzéseket:
0,15,30,45 08 * * 2 /home/frank/bar.sh 30 20 1-15 1,6 1-5 /home/frank/foobar.sh
Az első sorban a bar.sh
script minden kedden 08:00-kor, 08:15-kor, 08:30-kor és 08:45-kor kerül végrehajtásra. A második sorban a foobar.sh
script hétfőtől péntekig, január és június első tizenöt napján 08:30-kor kerül végrehajtásra.
Warning
|
Bár a crontab fájlok kézzel is szerkeszthetők, mindig ajánlott a |
A fent említett -e
kapcsoló mellett a crontab
parancsnak más hasznos kapcsolói is vannak:
-l
-
Az aktuális crontab megjelenítése a standard kimeneten.
-r
-
Az aktuális crontab eltávolítása.
-u
-
Annak a felhasználónak a neve, akinek a crontab-ját módosítani kell. Ez az opció root jogosultságokat igényel, és lehetővé teszi a root felhasználó számára a felhasználói crontab fájlok szerkesztését.
Rendszerszintű cronjobok létrehozása
A felhasználói crontabokkal ellentétben a rendszerszintű crontabok frissítése egy szerkesztőprogrammal történik: ezért nem kell a crontab
parancsot futtatni az /etc/crontab
és az /etc/cron.d
állományok szerkesztéséhez. Ne feledjük, hogy a rendszerszintű crontab szerkesztésekor meg kell adni azt a fiókot, amely a cronjob futtatására szolgál (ez általában a root felhasználó)!
Ha például a /root
mappában található barfoo.sh
scriptet minden nap 01:30-kor szeretnénk futtatni, akkor nyissuk meg a /etc/crontab
állományt a kívánt szerkesztőprogrammal, és adjuk hozzá a következő sort:
30 01 * * * root /root/barfoo.sh >>/root/output.log 2>>/root/error.log
A fenti példában a job kimenete a /root/output.log
, míg a hibák a /root/error.log
állományba kerülnek.
Warning
|
Hacsak a kimenet nincs átirányítva egy fájlba, mint a fenti példában (vagy a |
A jobok ütemezéséhez való hozzáférés konfigurálása
Linuxban a /etc/cron.allow
és /etc/cron.deny
fájlokat használjuk a crontab
korlátozások beállítására. Különösen arra szolgálnak, hogy engedélyezzék vagy megtiltsák a cronjobok ütemezését különböző felhasználók számára. Ha az /etc/cron.allow
fájl létezik, akkor csak a benne felsorolt nem root felhasználók ütemezhetnek cronjobokat a crontab
paranccsal. Ha az /etc/cron.allow
nem létezik, de létezik az /etc/cron.deny
, akkor csak az ebben a fájlban felsorolt nem root felhasználók nem ütemezhetnek cronjobokat a crontab
paranccsal (ebben az esetben az üres /etc/cron.deny
azt jelenti, hogy minden felhasználónak engedélyezett a cronjobok ütemezése a crontab
paranccsal). Ha egyik fájl sem létezik, akkor a felhasználó hozzáférése a cronjobok ütemezéséhez a használt disztribúciótól függ.
Note
|
Az |
A cron egy alternatívája
A systemd rendszer- és szolgáltatáskezelőt használva a timers a cron
alternatívájaként állítható be a feladatok ütemezéséhez. Az időzítők a .timer
utótaggal azonosított systemd egységfájlok, és mindegyikhez kell egy megfelelő egységfájl, amely leírja az időzítő lejártakor aktiválandó egységet. Alapértelmezés szerint egy timer
aktiválja az azonos nevű szolgáltatást, kivéve a suffixet.
Az időzítő tartalmaz egy [Timer]
szakaszt, amely meghatározza, hogy az ütemezett jobok mikor fussanak. Az OnCalendar=
opciót használhatjuk a real-time timers (valósidejű időzítők) definiálására, amelyek ugyanúgy működnek, mint a cronjobok (a naptári eseménykifejezéseken alapulnak). Az OnCalendar=
kapcsoló esetén a következő szintaxisra van szükség:
DayOfWeek Year-Month-Day Hour:Minute:Second
A DayOfWeek
opcionális. A *
, /
és ,
operátoroknak ugyanaz a jelentésük, mint a cronjobok esetén, míg a két érték közötti ..
egy összefüggő tartományt jelöl. A DayOfWeek
megadásához használhatjuk a nap nevének első három betűjét vagy akár a teljes nevét.
Note
|
Meghatározhatunk monotonikus időzítőket (monotonic timers) is, amelyek egy adott kezdőponttól számított bizonyos idő elteltével aktiválódnak (például amikor a gép elindult, vagy amikor maga az időzítő aktiválódik). |
Ha például a /etc/systemd/system/foobar.service
nevű szolgáltatást minden hónap első hétfőjén 05:30-kor szeretnénk futtatni, akkor a következő sorokat adhatjuk hozzá a megfelelő /etc/systemd/system/foobar.timer
egységfájlhoz.
[Unit] Description=Run the foobar service [Timer] OnCalendar=Mon *-*-1..7 05:30:00 Persistent=true [Install] WantedBy=timers.target
Miután létrehoztuk az új időzítőt, engedélyezhetjük és elindíthatjuk a következő parancsok root felhasználóként történő futtatásával:
# systemctl enable foobar.timer # systemctl start foobar.timer
Az ütemezett job gyakoriságát megváltoztathatjuk az OnCalendar
érték módosításával, majd a systemctl daemon-reload
parancs beírásával.
Végül, ha az aktív időzítők listáját szeretnénk megtekinteni a következő idő szerint rendezve, akkor használhatjuk a systemctl list-timers
parancsot. Az --all
kapcsolót is hozzáadhatjuk, hogy az inaktív időzítőegységeket is lássuk.
Note
|
Ne feledjük, hogy az időzítők naplózva vannak a systemd journal fájlban és a különböző egységek logjait a |
A fent említett hosszabb normalizált formátum helyett használhatunk néhány speciális kifejezést, amelyek a jobok végrehajtásának bizonyos gyakoriságát írják le:
hourly
-
A megadott feladatot futtatása óránként egyszer, az óra elején.
daily
-
A megadott feladat futtatása naponta egyszer, éjfélkor.
weekly
-
A megadott feladat futtatása hetente egyszer, hétfőn éjfélkor.
monthly
-
A megadott feladat futtatása havonta egyszer, a hónap első napján éjfélkor.
yearly
-
A megadott feladat futtatása évente egyszer, január első napján éjfélkor.
Az idő- és dátum-specifikációk teljes listáját a systemd.timer(5)
man oldalain találhatjuk meg.
Gyakorló feladatok
-
Az alábbi
crontab
rövidítésekhez adjuk meg a megfelelő időmeghatározást (például a felhasználóicrontab
fájl első öt oszlopát):@hourly
@daily
@weekly
@monthly
@annually
-
Az alábbi
OnCalendar
rövidítésekhez adjuk meg a megfelelő időmeghatározást (a hosszabb normalizált formátumot):hourly
daily
weekly
monthly
yearly
-
Magyarázzuk meg az alábbi,
crontab
fájlban található időadatok jelentését:30 13 * * 1-5
00 09-18 * * *
30 08 1 1 *
0,20,40 11 * * Sun
00 09 10-20 1-3 *
*/20 * * * *
-
Magyarázzuk meg az alábbi, timer fájl
OnCalendar
opciójában használt következő időmeghatározások jelentését:*-*-* 08:30:00
Sat,Sun *-*-* 05:00:00
*-*-01 13:15,30,45:00
Fri *-09..12-* 16:20:00
Mon,Tue *-*-1,15 08:30:00
*-*-* *:00/05:00
Gondolkodtató feladatok
-
Feltételezve, hogy közönséges felhasználóként jogosultak vagyunk a
cron
programmal jobokat ütemezni, milyen parancsot használhatunk a saját crontab fájlunk létrehozásához? -
Hozzunk létre egy egyszerű ütemezett jobot, amely minden pénteken 01:00-kor végrehajtja a
date
parancsot! Hol láthatjuk a job kimenetét? -
Hozzunk létre egy másik ütemezett jobot, amely percenként végrehajtja a
foobar.sh
scriptet, átirányítva a kimenetet a home mappában lévőoutput.log
fájlba, így e-mailben csak a standard hiba kerüljön elküldésre! -
Nézzük meg az újonnan létrehozott ütemezett job
crontab
bejegyzését! Miért nem szükséges megadni annak a fájlnak az abszolút elérési útját, amelybe a szabványos kimenetet menti? És miért használhatjuk a./foobar.sh
parancsot a script futtatására? -
Szerkesszük az előző
crontab
bejegyzést úgy, hogy eltávolítjuk a kimenet átirányítását, és tiltsuk le az első létrehozott cron jobot! -
Hogyan küldhetjük el e-mailben az ütemezett job kimenetét és hibáit az
emma
felhasználói fióknak? És hogyan lehet elkerülni, hogy a standard kimenetet és a hibákat e-mailben küldjük el? -
Futtassuk az
ls -l /usr/bin/crontab
parancsot! Melyik speciális bit van beállítva, és mi a jelentése?
Összefoglalás
Ebben a leckében megtanultuk:
-
A
cron
használatát a jobok rendszeres időközönkénti futtatásához. -
A cronjobok menedzselését.
-
A felhasználói hozzáférés beállítását a cronjobok ütemezéséhez.
-
A systemd időzítő egységek szerepének megértését a
cron
alternatívájaként.
A leckében használt fájlok és parancsok:
crontab
-
Az egyes felhasználók
crontab
fájljainak karbantartása. /etc/cron.allow
és/etc/cron.deny
-
A
crontab
korlátozások beállításához használt speciális fájlok. /etc/crontab
-
Rendszerszintű crontab fájl.
/etc/cron.d
-
A mappa, ami a rendszerszintű crontab fájokat tartalmazza.
systemctl
-
A systemd rendszer- és szolgáltatáskezelő vezérlése. Az időzítőkkel kapcsolatban azok engedélyezésére és indítására használható.
Válaszok a gyakorló feladatokra
-
Az alábbi
crontab
rövidítésekhez adjuk meg a megfelelő időmeghatározást (azaz a felhasználóicrontab
fájl első öt oszlopát):@hourly
0 * * * *
@daily
0 0 * * *
@weekly
0 0 * * 0
@monthly
0 0 1 * *
@annually
0 0 1 1 *
-
Az alábbi
OnCalendar
rövidítésekhez adjuk meg a megfelelő időmeghatározást (a hosszabb normalizált formátumot):hourly
*-*-* *:00:00
daily
*-*-* 00:00:00
weekly
Mon *-*-* 00:00:00
monthly
*-*-01 00:00:00
yearly
*-01-01 00:00:00
-
Magyarázzuk meg az alábbi,
crontab
fájlban található időadatok jelentését:30 13 * * 1-5
13:30-kor a hét minden napján, hétfőtől péntekig
00 09-18 * * *
Minden nap és minden órában 09 órától 06 óráig
30 08 1 1 *
Január első napján 08:30-kor
0,20,40 11 * * Sun
Minden vasárnap 11:00, 11:20 és 11:40 órakor
00 09 10-20 1-3 *
Január, február és március 10. és 20. között reggel 9:00 órakor
*/20 * * * *
Húsz percenként
-
Magyarázzuk meg az alábbi, timer fájl
OnCalendar
opciójában használt következő időmeghatározások jelentését:*-*-* 08:30:00
Minden nap 08:30-kor
Sat,Sun *-*-* 05:00:00
Szombaton és vasárnap 05:00 órakor
*-*-01 13:15,30,45:00
A hónap első napján 13:15-kor, 13:30-kor és 13:45-kor
Fri *-09..12-* 16:20:00
Szeptemberben, októberben, novemberben és decemberben minden pénteken 16:20-kor
Mon,Tue *-*-1,15 08:30:00
Minden hónap első vagy tizenötödik napján reggel 8:30-kor, de csak akkor, ha ez a nap hétfőre vagy keddre esik
*-*-* *:00/05:00
Öt percenként
Válaszok a gondolkodtató feladatokra
-
Feltételezve, hogy egyszerű felhasználóként jogosultak vagyunk a
cron
programmal jobokat ütemezni, milyen parancsot használhatunk a saját crontab fájlunk létrehozásához?dave@hostname ~ $ crontab -e no crontab for dave - using an empty one Select an editor. To change later, run 'select-editor'. 1. /bin/ed 2. /bin/nano < ---- easiest 3. /usr/bin/emacs24 4. /usr/bin/vim.tiny Choose 1-4 [2]:
-
Hozzunk létre egy egyszerű ütemezett jobot, amely minden pénteken 01:00-kor végrehajtja a
date
parancsot! Hol láthatjuk a job kimenetét?00 13 * * 5 date
A kimenetet a felhasználó e-mailben kapja meg, ahhoz, hogy ezt megnézzük, használhatjuk a
mail
parancsot. -
Hozzunk létre egy másik ütemezett jobot, amely percenként végrehajtja a
foobar.sh
scriptet, átirányítva a kimenetet a home mappában lévőoutput.log
fájlba, így e-mailben csak a standard hiba kerüljön elküldésre!*/1 * * * * ./foobar.sh >> output.log
-
Nézzük meg az újonnan létrehozott ütemezett job
crontab
bejegyzését! Miért nem szükséges megadni annak a fájlnak az abszolút elérési útját, amelybe a szabványos kimenetet menti? És miért használhatjuk a./foobar.sh
parancsot a script futtatására?A
cron
a parancsok a felhasználó home mappájából hívódnak, hacsak acrontab
fájlban aHOME
környezeti változóval nem adunk meg más helyet. Emiatt használhatjuk a kimeneti fájl relatív elérési útvonalát, és a scriptet a./foobar.sh
paranccsal futtathatjuk. -
Szerkesszük az előző
crontab
bejegyzést úgy, hogy eltávolítjuk a kimenet átirányítását, és tiltsuk le az első létrehozott cron jobot!#00 13 * * 5 date */1 * * * * ./foobar.sh
Egy cron job letiltásához egyszerűen kommentezzük ki a megfelelő sort a
crontab
fájlban. -
Hogyan küldhetjük el e-mailben az ütemezett munka kimenetét és hibáit az
emma
felhasználói fióknak? És hogyan lehet elkerülni, hogy a standard kimenetet és a hibákat e-mailben küldjük el?Ahhoz, hogy a standard kimenetet és hibát
emma
címére küldjük, aMAILTO
környezeti változót kell beállítanunk acrontab
fájlban az alábbiak szerint:MAILTO="emma"
Ahhoz, hogy megadjuk a
cron
-nak, hogy nem kell e-mailt küldeni, aMAILTO
környezeti változóhoz üres értéket kell rendelnünk!MAILTO=""
-
Futtassuk az
ls -l /usr/bin/crontab
parancsot! Melyik speciális bit van beállítva, és mi a jelentése?$ ls -l /usr/bin/crontab -rwxr-sr-x 1 root crontab 25104 feb 10 2015 /usr/bin/crontab
A
crontab
parancsban az SGID bit be van állítva (azs
karakter a csoport futtatható flagje helyén), ami azt jelenti, hogy a parancs a csoport (tehát acrontab
) jogosultságaival kerül végrehajtásra. Ezért van az, hogy a közönséges felhasználók acrontab
paranccsal szerkeszthetik acrontab
fájlt. Vegyük figyelembe, hogy sok disztribúcióban a fájljogosultságok úgy vannak beállítva, hogy acrontab
fájlok csak acrontab
paranccsal szerkeszthetők!