Cron, de csak röviden!

Sudo beállítása

Nem akartam róla írni, de egy kérdésre válaszoltam, hogy: cron-ba tedd. És nagy értetlenséget tapasztaltam. Ami jogos is, mert jellemzően nem használják az emberek ezt a kis programot. Pedig érdemes megismerni! Mire is jó? Ez egy nagyon egyszerű időzítő program. A rendszeresen futtatni kívánt scripteket, programokat a megadott időpontban lefuttatja. Ha van olyan feladat, amit bármilyen ciklikussággal le kell futtatni, akkor azt érdemes lenne automatizálni. Ha a feladatra alkalmas a parancssor, és esetleg tudsz is egy scriptet írni rá, akkor már az időzítést kell megoldani. Erre jó lesz a cron. Itt sem térnék ki minden lehetőségre, csak az alapokat mutatom meg. Ha megtetszett, akkor olvass utána, és variáld úgy, ahogy az neked kell. Ha pedig valami miatt egyszerűbb megoldásra vágysz, akkor arra is lesz példa.

Cron és a crontab használata

Nagy a valószínűsége, hogy a rendszeredre telepítve van, de ha nincs, akkor telepíteni kell. Ha nincs fenn alapból (nálam sem volt), akkor olvass utána, hogy a disztribúciódban hogyan megy a telepítés. Én belefutottam abba, hogy felraktam a cront, és háát… nem ment! Mert nagy jóóól elfelejtettem megmondani a rendszernek, hogy háttérben intézze el a systemctl az indítást… Lent pár szóban taglalom.

Használata egyszerű:

crontab -e Ha nem létezik létrehozza a crontab-ot, majd megnyitja szerkesztésre.
crontab -l Listázza az aktuális feladatokat.
crontab -r Törli a crontab fájlt.

Egy példa, hogy átlásd a működését:

Ment.sh nevű programot óránként lefuttatom a cron segítségével a háttérben:

1 * * * * /home/laci/bin/ment.sh

Magyarázat: minden megkezdett óra első percében, a hónap minden napján fusson le a mentés.

Azaz két részből áll a sor. Az elején megadom, hogy mikor ismételgesse a feladatokat. Ez öt lehetséges pozícióban történik.

Perc (0-59)
Óra (0-23)
A hónap napja (1-31)
Hónap (1-12)
A hét napjai (0-6) (0=Vasárnap)

Ahol * van, azt jelenti, hogy minden egyes percben, órában stb. fusson. Ha egyes pozíciókban több értéket akarunk megadni, akkor azokat vesszővel választjuk el. 00,30 2,12,18  * * * azaz minden hónapban, minden nap, 2-kor délben és este hatkor, fél háromkor, délután fél egykor, fél hétkor fusson le.

Minden esetben meg kell adni mind az öt pozíciót, azaz minden esetben kötött a sorrend, és nem maradhat ki egyik sem. Perc Óra HónapNapja Hónap HétNapja sorrendben! Bár nem a legideálisabb, de én azt a szokást vettem fel, hogy visszafele kezdek el gondolkodni, azaz első kérdés, hogy a hét melyik napján fusson, majd melyik hónapban (általában mindegyikben), majd a hónap napjait (általában minden nap), majd az órát és a percet gondolom át.

Ez valóban jól kezelhető, de mi van ha minden második órában le akarom futtatni?

00 00,02,04,06,08,10,12,14,16,18,20,22 * * * 

Kicsit hosszú, de most önállóan azt is írd hozzá, hogy öt percenként…

A cron készítői erre is felkészültek, és egy egyszerűbb megoldást is bevethetünk.

A * azt jelenti, hogy minden, és a / valamiszám a ciklusosságot.

0 */2 * * * minden második óra

*/5 * * * * ötpercenként.

Megadhatunk tól-ig időszakot is, pld,. ha reggel 8-tól este 19-ig kell óránként, az utolsó percben lefuttatni valamit:

59 8-18 * * *

Azaz egy mentő script lefut minden munkaóra utolsó percében.

A másik fele, logikusan az adott parancs, amit futtatni kell. A parancs lehet egy script, de lehet egy parancs felparaméterezve, pld.:

0 8 * * * env DISPLAY=:0 /usr/bin/luckybackup --silent --skip-critical /home/laci/.luckyBackup/profiles/default.profile > /home/laci/.luckyBackup/logs/default-LastCronLog.log 2>&1

Látható, hogy nagyon jól beállítható a crontab-ba a feladatok ütemezése. Bár első olvasatban ez egy igencsak bonyolult, kockáknak való megoldás, de a gyakorlatban a “minden nap”, “minden óra, akárhányadik perce”, esetleg “szombat reggel nyolckor” szintű  megoldások az elterjedtek. Ha ennél összetettebb kell, akkor az interneten tucatszám vannak jó honlapok, ahol összeállíthatod az időzítést. https://crontab-generator.org/ jó oldal, ami egyszerű és gyors megoldást kínál.

Ha nem az eredeti, illetve a rendszer beállításban szereplő szerkesztőt akarod használni:

export VISUAL=nano; crontab -e

Cron egyszerűbben

De nekem ez nem kell! Ilyen kriksz-krikszkrakszokat én nem akarok megtanulni! – mondhatja bárki. Természetesen megoldható, de én a fenti megoldások használom kb. fél éve, a következőben mutatottat nem. A legtöbb rendszerben léteznek ilyen könyvtárak, vagy ezek egy része:

/etc/cron.hourly
/etc/cron.daily
/etc/cron.weekly
/etc/cron.monthly

könyvtár, amibe ha bemásolsz egy scriptet, akkor a megfelelő időben lefuttatja őket. Így egyszerűbb, mint minden scriptet a crontab-ba beírogatni. Nincs hibázás, elírás.

A megfelelő könyvtár egyértelmű, a neve is mutatja

hourly – óránként
daily – naponta
weekly – hetente
monthly – havonta fut le egyszer.

A másolást természeten emelt joggal tudod megtenni, rendszergazdaként. Így vagy su vagy a sudo parancsot használd, vagy kövesd az én módszeremet ctr+sift+F2 (vagy bármelyik F1-F6 közt) és belépek root-ként, így nem egy grafikus felületű terminál programjában dolgozom. Így biztosan tudatosul bennem, hogy most adminisztratív munkát végzek, emelt kockázattal. Én az ilyen másoláshoz az örök klasszikust a mc–t használom. Nagyon kezes, gyors és átlátható. Ha nincs a gépeden fenn, akkor telepítsd és ismerd meg!

Ha mindent jól csináltál ezentúl az adott periódus szerint helyetted megteszi a Linux magától a dolgodat.

Arch Linux alatt a cron beüzemelése

Több lépésből is állhat, ha a disztribútorod nem állította be. Elsőnek a cron-t majd a dcron-t tettem fel. Majd

systemctl start dcron
systemctl status dcron

A kimenet:
dcron.service – Periodic Command Scheduler
Loaded: loaded (/usr/lib/systemd/system/dcron.service; enabled; vendor preset: disabled)
Active: active (running) since Wed 2020-05-06 17:24:19 CEST; 32min ago
Main PID: 1348 (crond)

Ha minden jó, akkor

systemctl enable dcron

de ezt már rendszergazdaként! Ezzel már automatikussá teszed a crond démon futását, ami a háttérben intézi a munkát.

Cron tesztelése

Ha csak tesztelni akarod, hogy minden jó, akkor első lépésben

crontab -e

majd nagyon “komoly” feladatot adsz a cron-nak, minden percben írja egy fájlba a dátumot.

*  *  *  *  * date >> /home/laci/date.txt

A laci helyett a te felhasználói neved legyen. Majd mented, és vársz pár percet, és

cat /home/laci/date.txt

Ha ott a dátum, akkor már minden jól fog mással is működni.

Kiegészítés: kimarite a linuxmint.hu fórumán tett pár kiegészítést a cron-hoz. Érdemes arra is ránézni. Egy érdekes részt emelek itt ki, amit én még nem használtam, de van benne ráció, hogy a későbbiekben ezt a megoldást is használjam.

Rendszerindítás után én jellemzően az OpenBox és más asztali környezetben az autostart lehetőséget használom. Ami bár eltérő helyen, de sok felületen megtalálható. Ismétlésképp: az OpenBox-ban a /home/laci/.config/openbox/autostart fájltól beszélek! ide szépen felsorolom az indítandó parancsokat, így indulás után már a felületem olyan lesz, amilyenre alakítottam, az a program indul, ami kell stb.

Erre  alkalmas a cron is, ha @reboot–ot adjuk meg neki a sor elején, ahol az időpontokat definiáltuk.

Példa, script futtatásával (a scrip és elérési útja példa):

@reboot /home/laci/bin/példa.sh

Ha késleltetnéd (300 másodperc, sleep alkalmazás) a rendszer indítás utáni futtatást (a scrip és elérési útja példa):

@reboot sleep 300 && 

vagy

@reboot sleep 300; /home/laci/bin/példa.sh

Így elég jól beállíthatod az indulást követő teendőket a gépnek. Bár sokan tartanak a cron használatától, de ez a megoldás sokkal profibb, mint indulás után kézzel indítgatni a programokat, futtatni a scripteket.

Related Posts