2008. október 26., vasárnap

A crontab csoda

elhasználói crontab-ok manipulálása (Dillon's Cron)

HASZNÁLAT

crontab file [-u user] - crontab cseréje file -ból
crontab - [-u user] - crontab cseréje standard inputról
crontab -l [user] - a felhasználói crontab listázása
crontab -e [user] - a felhasználói crontab szerkesztése
crontab -d [user] - felhasználói crontab törlése
crontab -c dir - crontab directory megadása

LEÍRÁS

crontab

Ezzel a paranccsal egy-egy felhasználóra vonatkozó crontabot lehet módosítani. Csak a superuser adhat meg a magáétól különböző felhasználónevet, illetve más crontab könyvtárat a parancshoz. Általában a -e opció jeleneti a saját crontab -unk módosítását. A crontab -ok módósításához a /usr/bin/vi -t, illetve a VISUAL környezeti változóban meghatározott szerkesztőt hasznalja a parancs.

Eltérően más crond/crontab -októl ennek a crontab -nak nem célja,hogy minden szóbajövö feladatot megoldjon. Őszintén szólva egy shellscript sokkal jobban használható a környezet manipulálására mint a cron, és nem látok különösebb indokot, hogy a felhasználók saját shellt használjanak, (amihez szükség van a kulcsszavukra) cron parancsok futtatásahoz, hiszen ezeknél külön kell kezelni a non-user crontab -eket, mint például az UUCP -t. A crontab parancsok futtatása a /bin/sh -val történik, és csak három környezeti változó (USER, HOME, SHELL) íródik át.

a crond automatikusan detektálja az időbeli változásokat. Az egy óránál fiatalabb visszafelé indexelt időátálítások hatására NEM futnak újra az eltelt időszakban már kiadott crontab parancsok. Ha előrefelé indexeljük az időt, úgy, hogy kevesebb mint egy órával mutat a jövőbe, akkor a kimarado parancsok pontosan egyszer hajtódnak végre. Akár a jövőbe, akár a múltba mutató egy óránál nagyobb változtatások hatására a crond újraszinkronizál, és nem adja ki az ezáltal kimaradó parancsokat. A parancs nem is próbálja az esetleges úraindítás miatt elvesztett parancsokat újrafuttatni, valamint a parancsok nem kerülnek végrehajtásra akkor sem, ha az előzőleg kiadott parancs még fut. Például ha a crontab -ban megadjuk a 'sleep 70' parancsot, és percenként akarjuk végrehajtatni, akkor a cron csak két percenként fogja tudni kiadni azokat. Ha ez a tulajdonság kellemetlen lenne, akkor még mindig futtathatjuk a parancsainkat a háttérben az '&' jellel. crond automatically detects changes in the time. Reverse-indexed time changes less then an hour old will NOT re-run crontab commands

A crontab formátum nagyjából megegyezik a vixiecron formátumával, de a crontab esetében néhány komplexebb opció hiányzik. Az egyes mezők tartalmazhatnak időpontot, időintervallumot, skip faktoros időintervallumot, szimbólikus intervallumot a hét napjaira, illetve az év hónapjaira, valamint további részintervallumokat vesszővel elválasztva. A crontab file -ban lévő üres, vagy hashmark -kal (#) kezdődő sorokat a parancs nem veszi figyelembe. Ha megadtuk a hét és a hónap egyik napját is, akkor a crontab bejegyzés le fog futni minden héten a megadott napon, valamint minden hónapban a megadott napon.(A két feltétel vagy kapcsolatát képezzük.)

# PERC ÓRA NAP HÓNAP AHÉTEGYNAPJA PARANCS # MIN HOUR DAY MONTH DAYOFWEEK COMMAND
# at 6:10 a.m. every day # at 6:10 a.m. every day
10 6 * * * date

# minden második órában az óra végén
0 */2 * * * date

# minden második óraban reggel 11-től este 7-ig , valamint este 8-kor
0 23-7/2,8 * * * date

# este 11-kor negyedikén, valamint minden hétfőn, kedden, és szerdan
0 11 4 * mon-wed date 0 11 4 * mon-wed date

# január elsején délután 4-kor # 4:00 a.m. on january 1st
0 4 1 jan * date 0 4 1 jan * date

# óránként egyszer, és minden kimenet a log file -ba menjen # once an hour, all output appended to log file
0 4 1 jan * date >>/var/log/messages 2>&1 0 4 1 jan * date >>/var/log/messages 2>&1

A sor parancsrésze a /bin/sh -c -dal fut így tartalmazhat bármilyen érvényes bourne shell parancsot. Általában exec -kel szokás futtatni a parancsot, hogy ne zavarjon bele a process táblába. Szintén gyakori, hogy a kimenetet log file -ba irányitjuk át. Ha nem így teszünk, akkor a parancs a stdout -ban, illetve a stderr -ben hozza létre a kimenetet. Az eredményeket pedig a kérdéses felhasználónak postázza. Ha ezt a mechanizmust speciális felhasználókra alkalmazzuk, mint például az UUCP, akkor ajánlatos aliast készíteni a userhez, hogy a a küldemény valaki másnak menjen, peldául a root -nak, vagy a postamster -nek.

A cron használ egy belső gyorsindexelő rendszert, hogy valamelyest tehermentesítse CPU -t a futtatandó parancsok kikeresésekor. Többszáz crontab -ot kezelhetünk többezer bejegyzéssel anélkül, hogy észrevehetően igénybe vennénk a processzor erőforrásait.

Az EMÍR krontabja:

# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user command
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
#

Nincsenek megjegyzések: