Cron - nekoliko trikova

Cron je nezaobilazni sistemski servis, kojega koristimo u svakoj prilici i za svakovrsne potrebe.  Iako cron nema veću rezoluciju od jedne minute, za većinu potreba je ovo sasvim dovoljno.  Konfiguracija crona je svima poznata, ali ima detalja koje vrijedi proučiti.

Standardni redak u cronu (točnije datoteci crontab) se sastoji od 5 polja: minute, sati, dan u mjesecu, mjesec i dan u tjednu, plus jedno polje za naredbu koju imamo namjeru izvršiti. Prvih pet polja se mogu jednostavno zamijeniti s posebnim ključnim riječima:

@daily         Pokreće se jednom dnevno (ponoć), ekvivalent je "0 0 * * *".
@midnight      isto kao @daily
@weekly        Pokreće se jednom tjedno (nedjelja u ponoć), ekvivalent je "0 0 * * 0".
@monthly       Pokreće se jednom mjesečno, ekvivalent je "0 0 1 * *".
@yearly        Pokreće se jednom godišnje (1.1.), ekvivalent je "0 0 1 1 *".
@annually      Isto kao @yearly
@hourly        Pokreće se jednom na sat, ekvivalent je "0 * * * *".
@reboot        Pokreće se kod restarta ili "hladnog" pokretanja

Vrlo je zgodno, umjesto da pamtimo koje je koje polje, jednostavno staviti ove skraćene oblike, poput:

@daily:@daily /moja/skripta.sh

Posebno je zanimljiv "@reboot". On će, sukladno imenu, pokrenuti program kod reboota ili hladnog starta računala. Za ovu se operaciju obično koristi /etc/init.d/rc.local, ali to je skripta iz paketa "initscripts" pa svoje modifikacije možete slučajno pregaziti u nekoj nadogradnji.  Također, rc.local izvršava naredbu kao korisnik root, pa morate koristiti su ili sudo kako bi izvršavali naredbe kao neki drugi korisnik.

Cron nema tih problema, i na startu će izvršiti kao standardni cronjob, dakle pod UID-om vlasnika tog cronjoba.

Standardni cron na Linuxu prihvaća i nekoliko drugih proširenja, kojih nema ili dugo nije bilo na standardnim Unixima. Moguće je postaviti varijablu PATH, te tako proširiti popis direktorija u kojima će se tražiti naredba. Može i suprotno, iz sigurnosnih razloga ograničiti broj direktorija samo na nekolicinu:

PATH=/usr/sbin:/sbin

Varijabla se upisuje na vrhu crontab datoteke, kao i MAILTO:

MAILTO=netko@domena.hr

Varijablu MAILTO ćete upotrijebiti kada želite obavijest o izvršenom cronjobu poslati na neku drugu adresu, a ne na adresu vlasnika cronjoba. Ukoliko ne želite nikakve obavijesti mailom, varijablu postavite na "praznu" vrijednost ovako:

MAILTO=""

Alternativno, možete preusmjeriti standardni izlaz i grešku u /dev/null, pa se mail neće poslati jer nema nikakvog izlaza (outputa):

@weekly    /neka/naredba > /dev/null 2>&1

Ostale varijable koje možete upotrijebiti, odnosno promijeniti su: HOME i SHELL.

Iz crona možete direktno poslati mail, bez da koristite posebnu skriptu za to. Iako iz skripte možete ispisati neki tekst, što će vam se poslati mailom, ponekad je praktičnije koristiti ovakve onelinere:

30 8 * * 1 mailx -s "PODSJETNIK" root%%Provjeriti UPS!%%

Svakog ponedjeljka u 8:30 ćete dobiti mail naslova "PODSJETNIK" i sadržaja kojeg upišete.  Pri tome je znak "%" oznaka za novi red (\n), pa svako njegovo pojavljivanje znači prijelaz u novi red.  Ukoliko baš želite upotrijebiti znak "%", morate ga upisati ovako: "\%".

Cron je dosta fleksibilan, ali je orijentiran na periodično izvršavanje. Ne možete odrediti točan datum kada se nešto treba izvršiti, jer nema mogućnosti upisivanja godine. Da biste to postigli, možete upotrijebiti ovakav oblik:

0 12 1 12 * test `date +'\%Y\%m\%d'` == 20151201 && mailx -s "PODSJETNIK: \
   obnovi certifikat!" root%%Obnovi certifikat!%%

Prvog prosinca 2015. godine u podne će stići obavijest da će isteći certifikat za servise, iako cron ovakve stvari ne omogućava direktno. No, malo skriptiranja će pomoći.

Ukoliko imate naprednije korisnike, možete kontrolirati njihovu uporabu crona na način sličan tcp_wrappersu. Pomoću datoteka /etc/cron.allow i /etc/cron.deny možete kontrolirati tko može rabiti cron. Ukoliko nijedna datoteka ne postoji, svi mogu koristiti cron.  Ukoliko postoji datoteka /etc/cron.deny, korisnici kojima je zabranjeno korištenje crona moraju biti navedeni. Ukoliko postoji datoteka /etc/cron.allow, korisnici koji mogu koristiti cron moraju biti navedeni unutar datoteke.

Koji ćete način koristiti ovaj mehanizam, ovisi o vašoj sigurnosnoj politici.

Cron je stari, ali pouzdani servis, a sve što treba je znati iskoristiti sve prednosti koje ekstenzije pružaju. Iako su neke ekstenzije specifične za linux, sumnjamo da je danas to problem, jer linuxi dominiraju nekad neprikosnovenim Unix tržištem.

Zdravko Rašić

Kuharice: 
Kategorije: 
Vote: 
0
No votes yet