Cron, de csak röviden!

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.

Ha hasznosnak találtad nézz be a blogomba is: https://magyarlinux.hu/

Hozzászólások

kimarite képe

@reboot (sleep | sudo)

Értékelés: 

0
Még nincs értékelve

Kiváló, magyarul talán nem is létezett cron leírás. :)

Debian-alapú rendszerek sudo-znak...

Szoktam használtni a rögtön rendszerindításkor való parancssor futtatást, amelynek a @reboot a paramétere.

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

@reboot /home/vivek/bin/installnetkit.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 && /home/wwwjobs/clean-static-cache.sh

vagy

@reboot sleep 300 ; /home/wwwjobs/clean-static-cache.sh

A crontab felhasználó- és rendszer szinten is szerkeszthető.

-- felhasználó szint (a készenléti jelzés/prompt  terminálban: $. Paraméter: e)

crontab -e

... és a meglévő ütemezések listázása (paraméter: l | el)

crontab -l

-- rendszer szint a sudo-val például (készenléti jelzés/prompt a terminálban: $)

sudo crontab -e

... és a meglévő ütemezések listázása

sudo crontab -l

Ha esetleg nem a sudo-val kapsz admin jogot, akkor a sudo nem kell a fenit parancssorba, a terminál készenléti jelzés/prompt # lesz, de renszerszinten tevékenykedsz! Ha nem renszerszinten, hanem egy adott felhasználóra nézve tevékenykednél, akkor olvasd el a következőket...

Több felhasználós rendszeren adott felhasználóra (a szerkesztés):

Megjegyzés: belépett felhasználónál nem kell admin jog, ha így használod a parancssort (saját crontab: $):

crontab -e
crontab -l

... visszatérve (ha paraméterezel: e és u), akkor

-- másik felhasználóra vonatkozóan (be kell helyettesíteni a felhasználónevet)

sudo crontab -e -u felhasználónév

-- saját felhasználóra, amikor az be van lépve (környezeti változóval),

sudo crontab -e -u $USER

... amikor más felhasználó van belépve, és a vivek nevű felhasználó crontabját szerkesztenéd

sudo crontab -e -u vivek

A cron engedélyezése, indítása, leállítása, újraindítása, újra betöltése és állapotának lekérdezése (a felsorolás szerint) a felhasználó felé a systemd-nél:

sudo systemctl enable cron.service
sudo systemctl start cron.service
sudo systemctl stop cron.service
sudo systemctl restart cron.service
sudo systemctl reload cron.service
systemctl status cron.service

Forrás: https://www.cyberciti.biz/faq/linux-execute-cron-job-after-system-reboot/

Köszi!

Köszi :)

Értékelés: 

0
Még nincs értékelve

A reboot-os észt átemeltem az eredeti részbe. Köszi, hogy felhívtad rá a figyelmemet!

kimarite képe

@reboot (sleep | sudo) - teljes elérési út

Értékelés: 

0
Még nincs értékelve

#1 Érdemes teljes elérési úttal beírni az alkalmazásokat!

Példa:

@reboot sleep 300 ; /home/wwwjobs/clean-static-cache.sh

Ez a helyes:

@reboot /usr/bin/sleep 300 ; /home/wwwjobs/clean-static-cache.sh

Ha a systemctl vagy akármi más alkalmazás szerepel a Cronban, akkor a which parancs mutatja meg a teljes elérési utat.

Példa a systemctl és a sleep esetén (a te rendszereden más helyen is lehet az alkalmazás, használd ezt az ellenőrzést!):

which systemctl
/usr/bin/systemctl
which sleep
/usr/bin/sleep