Cron je sastavni dio raznih Unix sustava od samih njegovih početaka. Drugi operativni sustavi također imaju slične sustave periodičkog izvršavanja naredbi, samo s drugim imenom (primjerice, "event scheduler"). No, nitko nema ugrađeni scheduler koji reagira na određene događaje. Incron je upravo to, a reagira na promjene u definiranim direktorijima, ili nad definiranim datotekama. Promjene uključuju modificiranje datoteke, promjene vlasništva i atributa, te brisanje i kreiranje.
Iako postoje programi koji upravo ovakve stvari rade na Windowsima, na Linuxu se teže nalaze. Incron je jedan od takvih programa s kojim smo odlučili automatizirati dio naših potreba. Naziv incron dolazi od "inotify cron". Inotify je, s druge strane, mehanizam, odnosno API linuxovog kernela koji obavještava o promjenama na datotečnom sustavu. Više o njemu na adresi: https://en.wikipedia.org/wiki/Inotify [1] .
Instalacija je identična kao i kod ostalih paketa, samo treba napraviti "apt-get install":
# apt-get install incron
The following NEW packages will be installed:
incron
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 104 kB of archives.
...
Setting up incron (0.5.10-1) ...
Adding group `incron' (GID 142) ...
Starting File system events scheduler: incron.
Ovime je incron instaliran i pokrenut. Idemo dalje.
Incron slijedi imenovanje crontaba. Kako cron ima crontab, tako incron ima incrontab. Slično je i sa opcijama, pa će opcija "-l" izlistati postojeće incron jobove, a slično je i s drugim opcijama. Naravno, manual je dostupan, tamo su objašnjenje sve mogućnosti. Nekolicinu ćemo obraditi u članku.
Incron ima postavke sigurnosti koje "po defaultu" onemogućuju ikome da koristi incron. Problem je jednostavno rješiv s naredbom "rm /etc/incron.allow /etc/incron.deny", a o finijim podjelama ćemo nešto kasnije.
Novi incron job ćemo kreirati sa:
$ incrontab -e
Sintaksa je ipak pomalo drugačija nego kod crona, što se moglo očekivati. Sintaksa nije obrađena u glavnoj man stranici, nego u sekciji 5, znači da ćete informacije o sintaksi dobiti naredbom "man 5 incrontab".
Sintaksa je sljedeća:
<putanja> <maska> <naredba>
<putanja> Ovo je naravno putanja do direktorija odnosno datoteke
<maska> Ovdje dolazi jedna od sljedećih opcija, odnosno događaja:
IN_OPEN | Datoteka je bila otvorena |
IN_CLOSE_WRITE | Datoteka otvorena za pisanje je bila zatvorena |
IN_CLOSE_NOWRITE | Neotvorena datoteka (za pisanje) je bila zatvorena |
IN_CLOSE | Kombinacija IN_CLOSE_WRITE i IN_CLOSE_NOWRITE |
IN_ACCESS | Datoteci je pristupljeno |
IN_ATTRIB | Metapodaci su promijenjeni (permisije, oznaka vremena, prošireni atributi... |
IN_CREATE | Datoteka ili direktorij je bio kreiran |
IN_DELETE | Datoteka ili direktorij je bio obrisan |
IN_DELETE_SELF | Promatrana datoteka ili dir je obrisan |
IN_MODIFY | Promatrana datoteka je bila modficirana |
IN_MOVE_SELF | Promatrana datoteka ili direktorij je bio pomaknut (move) |
IN_MOVED_FROM | Datoteka je bila maknuta iz promatranog direktroija |
IN_MOVED_TO | Datoteka je bila pomaknuta u promatrani direktorij |
IN_MOVE | Kombinacija IN_MOVED_TO i IN_MOVED_FROM |
IN_ALL_EVENTS | Bit-maska svih događaja |
Kada pratimo događaje u direktoriju, događaji se prate za sve datoteke u tom direktoriju. Kako ćemo onda znati koja se datoteka promijenila? Jednostavno, ime datoteke će se pojaviti u polju "name".
U manualu su spomenuti i dodatni simboli u maski:
IN_DONT_FOLLOW | Ne razrješuj stazu ako je simbolički link (razrješiti = dereferencirati) |
IN_ONESHOT | Prati stazu, ali "okini" samo jedanput |
IN_ONLYDIR | Prati samo ako je riječ o direktoriju |
IN_NO_LOOP | Poseban simbol, onemogućava praćenje dok ne završi proces praćenja koji trenutno traje |
Staza (ili putanja, path) je puno ime datoteke ili direktorija, sve je to za Unix/Linux isto, riječ je samo o drugačijem unosu u odgovarajući inode-u.
Incron prati događaje unutar direktorija, ali ne i u poddirektorijima, pa na to obratite pažnju.
Objasnili smo što je to "putanja", "maska", a ostaje nam još objasniti "naredbu". <naredba> je naredba koja se treba izvršiti kada se neki događaj ostvari.
Ovdje se mogu koristiti određeni zamjenski znakovi (wildcards):
$$ dolarski znak
$@ staza koja se prati na dat. sustavu
$# naziv datoteke koja je "okinula" događaj
$% zastavice događaja (tekstualno)
$& zastavice događaja (numerički)
Doslovce, ovi znakovi su varijable koje se popunjavaju određenim vrijednostima koje možete dalje koristiti u svojim skriptama. Vrijeme je za primjer.
Napravimo direktorij koji ćemo pratiti i otvorimo incrontab:
# mkdir /testni/direktorij
# incrontab -e
U datoteku upišimo sljedeći testni redak:
/testni/direktorij/ IN_CREATE echo "$$ $@ $# $% $&"
Pazite na sintaksu pisanja direktorija, obavezno ide "/" nakraju!
Napravimo novu datoteku, može i jednostavan "touch":
# touch /testni/direktorij/test.txt
U syslogu ćemo moći vidjeti unose poput ovoga:
Aug 30 14:38:57 server incrond[18604]: (korisnik) CMD ( echo "$ /testni/direktorij/ test.txt IN_CREATE 256")
Aug 30 14:38:57 server incrond[6515]: cannot exec process: No such file or directory
Čini se da radi, ali kakva je ovo greška na kraju? Čini se da je incrontab izuzetno osjetljiv na sintaksu [2], pa nismo ni bili svjesni da višestruki prazni znakovi ne "mogu proći". U tekstu se to slabo može vidjeti, ali između "echo" i parametara postoje dva znaka razmaka, a dopušten je samo jedan!
Za svaki slučaj, stavili smo po jedan razmak između svih opcija i parametara, i sada više nemamo poruku o greški. No, sada zorno vidimo što znači koja "varijabla".
U nastavku ćemo pokazati naprednije primjere i sigurnosne postavke, odnosno tko smije, a tko ne smije pokretati incron.