2008. augusztus 25., hétfő

Crontab - Egyszerűen misztikus...

Nem véletlen a cím, hiszen itt egy olyan lehetőségről lesz szó, amit szinte minden Linux felhasználó ismer, tudja mire való, de csak nagyon kevesen használják. Miért van ez? Mert sokan túl bonyolultnak tartják, pedig meglátjátok mennyire egyszerű, és mennyire praktikus tud lenni.

A Cron lehetőséget ad rendszeresen elvégzendő feladatok ütemezésére. A crontab egy egyszerű felépítésű szöveges fájlt, amely szerkesztésével tudunk pontosan megadott időpontokban parancsokat futtatni.

Létezhet továbbá két konfigurációs fájl, amelyek megszabják hogy a rendszer mely felhasználói adhatnak meg ütemezett feladatokat. Crontab-et használhatsz ha a felhasználóneved megjelenik a /usr/lib/cron/cron.allow fájlban. Ha ez a fájl nem létezik, és a felhasználóneved nem szerepel a /usr/lib/cron/cron.deny fájlban, szintén nyerő vagy. Ha a cron.deny üres, valamint a cron.allow nem létezik, akkor mindenkinek van lehetősége ütemezésre.
Mielőtt bárki frászt kapna, közlöm hogy az Ubuntuban alapból szerkesztheted a crontab-et, így aztán az imént említett két konfigurációs fájlal nem kell foglalkozni.

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

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

A crontab fájl hat oszlopra oszlik, amelyek pontosan leírt szabályok alapján töltendőek ki.
Ezek sorrendben a következőek:










  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, és ha nem kívánjuk valamely adatot megadni annak oszlopába "*"-ot írunk. Amennyiben szükséges egy oszlopban több adatot megadni, azokat vesszővel válasszuk el, de szóközt NE tegyünk a vessző után! Ha egy időintervallumra szeretnénk hivatkozni, akkor a két számot kötőjellel különítjük el.

Nézzünk pár példát!
Ha pl. szeretnénk minden nap 15:20-kor kiüríteni a tmp könyvtárat, akkor a következő sort írjuk be:
20 15 * * * rm /home/felhasználóneved/tmp/*

Ha ugyanezt mondjuk csak a hétfői napokon szeretnénk megtenni:
20 15 * * 1 rm /home/felhasználóneved/tmp/*

Ha minden hónap 10. és 20. napján szeretnénk törölni a fájlokat:
20 15 10,20 * * rm /home/felhasználóneved/tmp/*

Talán még annyit érdemes hozzátenni érdekességként, hogy amennyiben szeretnénk naplózni a cron tevékenységét, egyszerűen irányítsuk át a megadott parancs kimenetét egy fájlba a következő képpen:
20 15 * * * rm /home/felhasználóneved/tmp/* > /home/felhasználóneved/rm_temp.log


Természetesen ezzel a Cron lehetősei közül csak a felszint kapargattuk, viszont szerintem ennyi elég a lényeg megértéséhez.
Ha valakinek nem tetszik az alapértelmezett GNU nano szerkesztő, van lehetőség grafikus programok használatára, de ez már egy következő cikk lehet.

4 megjegyzés:

Névtelen írta...

Tiszteletem!

Kimaradtak a majdnem legfontosabb részek a crontabból:

*/5 : minden 5-el osztható alkalommal (0,5,10,15,...). Tipikus alkalmazása: minden 5. percben, vagy minden fél órában.

1-3,8,10-12 : 1,2,3,8,10,11,12. Tipikus alkalmazása a hétköznapok, vagy a munkaidő, vagy a nyár jelöléséhez.

Egyészen banális példákkal szemléltetve:

Minden hétköznap reggel 7.30kor indítsa el a ébresztő-t:
30 7 * * 1-5 /usr/bin/wakeup.sh

Minden hétköznap munkaidőban csináljuk a munkánkat:
* 8-12,13-17 * * 1-5 /bin/domyjob -q

Minden este 6tól 5 percenként noszogassa az asszonyt, hogy hozzon kaját (kivéve nyáron, mert akkor ő is nyaralhat):
*/5 18-22 * 1-5,9-12 * if ! [ -s /dev/mybelly ];then echo "Food, now!" > /dev/mywoman/ ;fi

Vodnik írta...

És hogy éred el az mondjuk, hogy hétköznap reggel 7-kor, hétvégén 9-kor csörögjön az óra?

Én erre gondolok, csak nem tudom, hogy ez így jó-e:

0 7 * * 1-5 $HOME/scripts/wakeup.py
0 9 * * 0,6 $HOME/scripts/wakeup.py

hm?

Unknown írta...

Nem muszáj naplózni a kimenetet. A cron minden feladat után levelet küld az adott felhasználónak, ha volt az indított programnak kimenete. Lokális levelezés alapból van pl. Debianon, a levelek a /var/mail mappába kerülnek felhasználónként külön fájlba. Ezt pl. a mutt programmal (parancssoros) lehet olvasni.

Ezt elkerülenő, el lehet nyomni a program kimenetét:

Ez elnyomja a program kimenetét és hibakimenetét is:
20 15 * * * rm /home/felhasználóneved/tmp/* &> /dev/null
Ez csak a program kimenetét nyomja el:
20 15 * * * rm /home/felhasználóneved/tmp/* > /dev/null

Valamint ha így írjuk az eredeti bejegyzést, akkor hozzáfűzi az adott fájlhoz a parancs kimenetét (az eredeti szerint felülírja mindig):
20 15 * * * rm /home/felhasználóneved/tmp/* >> /home/felhasználóneved/rm_temp.log

HP írta...

Köszönjük Imre, ez nagyon hasznos kiegészítés!