Mindent a CronTabról

img

Hobbi szinten szervert üzemeltetek, emiatt kénytelen voltam beletanulni a crontab rejtelmeibe. Nem volt nehéz, így most leírom az általános információkat, amiket jó, ha tudsz.

Tehát Linux rendszereken lehetőségünk van időzített feladatokat beállítani. Erre használhatjuk a crontabot. Akinek a tárhelyszolgáltatója engedélyezi, az használhatja ezt a funkciót akár saját tárhelyén is. Erről érdemes megkérdezni a saját tárhely szolgáltatódat, hogy náluk pontosan milyen parancsok és milyen elérési úton futtathatóak.

Én most a linux terminálon keresztül használható parancsot mutatom be.

Mi a Crontab?

A Cron lehetőséget ad ütemezett feladatok beállítására Linux rendszereken. A crontab egy egyszerű szöveges fájl, amely a futtatandó parancsokat és a hozzájuk tatrtozó paramétereket tartalmazza.

Honnan tudhatod, hogy van jogosultságod Cront futtatni?

Létezik két file, amikkel korlátozni lehet, hogy az adott rendszeren melyik felhasználó futtathat cronjobot. Ha saját telepítésű, Ubuntu alapú rendszerünk van, akkor alap esetben használhatod. (Többi rendszernél nincs tapasztalatom, így hülyeséget sem akarok írni.)

Tehát, ha a /usr/lib/cron/cron.allow vagy a /etc/cron.allow fájlban szerepel a nevünk, esetleg nem létezik a file, és a /usr/lib/cron/cron.deny vagy a /etc/cron.deny fileban nem szerepel a felhasználónevünk, akkor van jogunk módosítani a crontab-et.

Hogyan használjuk?

Három féle kapcsolóval használhatjuk a crontab parancsot.

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

Ha első alkalommal szerkesztjük a crontab-et, akkor megkérdezheti a rendszer, hogy melyik szerkesztőt szeretnénk használni. Nekem a nano jött be.

A crontab részei

a crontab összesen 6 oszlopból áll. Ezek sorban:

  1. Perc (0-59)
  2. Óra (0-23)
  3. A hónap napja (1-31)
  4. Hónap (1-12)
  5. A hét napjai (0-6) (0=Vasárnap)
  6. A végrehajtandó parancs

Az egyes oszlopokat szóközzel választjuk el, joker-karakterként “*”-ot használhatunk, ezzel, ha nem akarunk értéket megadni, helyettesíthetjük vele. Ha egy oszlopban több adatot akarunk megadni, akkor az értékek közé vesszőt kell tennünk, de a vessző után ne tegyünk szóközt. Ha intervallumot akarunk megadni, akkor kötőjelet kell az értékek közé tenni.

Egyszerűbb, ha bemutatom pár példával.

01 04 1 1 1 /usr/bin/valami_mappa/valami_parancs

A fenti példa a /usr/bin/valami_mappa/valami_parancs parancsot futtatja, hajnal 4:01-kor, minden január 1-én, ami hétfőre esik. Nah jó ez bonyolult lett :)

Amint említettem, lehet csillaggal helyettesíteni az oszlopokban. A csillag jelentése minden. Tehát minden percben, minden órában, minden nap, minden hónapban.

Így a fenti példát módosítva:

01 04 * * * /usr/bin/valami_mappa/valami_parancs

A példa azt jelenti, hogy minden nap, minden hónapban hajnal 4:01-kor fut le a parancsunk.

Vegyünk egy olyan példát is, ahol több értéket szeretnénk megadni:

01,31 04,05 1-15 1,6 * /usr/bin/valami_mappa/valami_parancs

Itt a következő történik. Minden Januárban és Júniusban (4. oszlop 1,6 értékkel) elsejétől tizenötödikéig (3. oszlop 1-15 értékkel) hajnal 4 és hajnal 5-kor (2. oszlop 04,05 értékkel) az első és 31. percben (1. oszlop 01,31 értékkel) fusson le a parancsunk. :) Tudom bonyolódik, de ettől vannak még cifrábbak is :)

Még egy fontos dolog maradt ki. Erre is muszáj kitérnünk, hisz van, hogy minden második órában akarunk valamit futtatni.

Ha a fentiekre alapozunk, akkor egy nagyon hosszú és átláthatatlan kódot kapunk:

00 00,02,04,06,08,10,12,14,16,18,20,22 * * * /usr/bin/valami_mappa/valami_parancs

Tehát ezt felejtsük el :)

Említettem, hogy van a *, ami mindent jelent. De ezt másra is használhatjuk:

*/5 : minden 5-el osztható alkalommal (0,5,10,15,20,25…).

Jelentése: minden 5. percben, vagy (*/30) minden fél órában.

Így az előző példa, így fog kinézni:

00 */2 * * * /usr/bin/valami_mappa/valami_parancs

Csak kicsit egyszerűbb :)

Aztán kombinálhatjuk is az értékeket:

1-4,6,8-12: 1,2,3,4,6,8,9,10,11,12. Például használhatjuk munkaidő, nyár vagy hétköznapok megjelölésére.

Erre mondjuk azt tudnám elképzelni hirtelen, hogy programozóként elvileg 10 perc pihenő jár óránként, így egy program reggel 8-tól munkaidő végéig, ebédszünet kivételével, minden órában értesít, hogy álljak fel a géptől. Hogy életképes legyen a példa 1 órás az ebédszünet (Tudom, hogy sehol sem annyi, főleg a kisebb informatikai cégeknél. Sőt, ha óránként a 10 percet ki akartuk használni, akkor kirúgással fenyegettek, vagy bércsökkentéssel :) Tehát ez most egy nagyon rossz példa ilyen téren, de példaként jó)

50 8-11,13-16 * * * /usr/bin/kelj_fel_es_jarj

Tehát reggel 8:50-kor jelez először a gép, egészen 11:50-ig, majd 13:50-16:50-ig. 12:00-13:00 között pedig kajálunk, ilyenkor nem vagyunk gépnél, tehát felesleges jeleznie.

Vagy ugyanez csak két feladat fut le, amik ki-be kapcsolgatják a monitorunkat a megadott időszakban, a fenti példára alapozva:

00 8-11,13-16 * * * /usr/bin/monitor_be
50 8-11,13-16 * * * /usr/bin/monitor_ki

Tehát reggel 8:00-11:00 között minden 0. percben bekapcsol a monitorunk, 50-kor ki. Délben a szokásos órás ebéd, majd 12:00-16:00 között ismét bekapcsol-kikapcsol, végül 16:50-kor mehetünk haza :)

A fenti példák alapján szerintem hétköznapi használatra simán elég ennyi. Persze lehet ezt fokozni a végtelenségig, de jelenleg nem az a célunk. Egyszerűen csak az alapokat mutattam meg.

Ami még kimaradt így a végén és talán fontos lehet, ha egy időben 2 jobot is futtatni akarunk, akkor nem kell 2 sorba írni ugyanazokkal a paraméterekkel, elég egyetlen sor és a két parancs közé &&.

Példa:
00 /2 * * * /usr/bin/parancs_1 && /usr/bin/parancs_2

Tehát, minden második órában fusson le a parancs_1 és a parancs_2.

Remélem ezzel a kis szösszenettel segítettem, hogy közelebb kerülj a cronjobokhoz.