Ovaj vodič će vam demonstrirati kako da iskoristite događaje sistema datoteka Linux (inotify) kako biste primali notifikacije svaki put kada se nova datoteka pojavi u određenom direktorijumu. Ove notifikacije možete koristiti kao okidače za automatizaciju raznih rutinskih zadataka na vašem sistemu.
Napisaćemo skriptu koja će pratiti određeni direktorijum i reagovati na nove datoteke koje se dodaju. Svaka novopristigla datoteka će biti kompresovana pomoću gzip-a i premeštena u drugi direktorijum odmah nakon detekcije. Skripta se oslanja na inotify podsistem, uz pomoć alata nazvanog inotify-tools. Pre svega, instalirajmo neophodan alat i isprobajmo kako funkcioniše.
Instalacija inotify-alata i gzip-a
Ukoliko koristite Ubuntu ili neku drugu distribuciju zasnovanu na Debianu, za instalaciju ovog paketa koristite apt-get. Ako koristite neku drugu Linux distribuciju, iskoristite alat za upravljanje paketima specifičan za vašu distribuciju.
sudo apt-get install inotify-tools gzip
Eksperimentisanje sa inotify-alatima
Započnimo praćenjem direktorijuma kako bismo videli koji se događaji aktiviraju kada nove datoteke stignu. Koristićemo alat inotifywatch, koji je deo paketa inotify-tools. Napravite novi direktorijum pod nazivom „dolazni“:
mkdir incoming
Započnite praćenje ovog direktorijuma izvršavanjem sledeće komande:
inotifywatch -v incoming
Ova komanda nalaže inotify-u da nadgleda sve događaje sistema datoteka unutar direktorijuma „dolazni“. Opcija -v omogućava da alat prikazuje dodatne informacije o svojim aktivnostima. Nismo naveli opciju vremenskog ograničenja (-t), tako da će komanda nastaviti da prikuplja događaje sve dok je ne prekinemo kombinacijom tastera CTRL+C. U ovom trenutku, vaš terminal bi trebalo da izgleda otprilike ovako:
Otvorite novi terminalski prozor (ili karticu) i prebacite se u „dolazni“ direktorijum. Upotrebite komandu touch da kreirate novu datoteku nazvanu „nova_datoteka“.
cd incoming/ touch nova_datoteka
Sada se vratite u prvi terminalski prozor i zaustavite inotifywatch pritiskom na CTRL+C.
Na konzoli će biti prikazana tabela događaja, koja ukazuje na jedan primer „create“, „open“, „attrib“ i „close_write“ događaja. Ova četiri događaja su se desila kada smo upotrebili touch komandu da kreiramo novu datoteku, podesili njene atribute pristupa datoteci, otvorili je kako bismo upisali nulti završni znak, a zatim je zatvorili. Ovo su samo neki od mnogih događaja koji se mogu pratiti na sistemu datoteka pomoću inotify-alata. Kompletnu listu možete pronaći na stranici sa uputstvima za inotifywatch.
Za naše potrebe, interesuju nas samo dva događaja:
- „create“ – kada se datoteka kreira u ciljnom direktorijumu.
- „moved_to“ – kada se datoteka premešta sa druge lokacije u ciljni direktorijum.
Pokrenimo ponovo inotifywatch, ali ovog puta, dajmo mu instrukcije da nadgleda samo ova dva događaja. Pokrenite sledeću komandu u prvom terminalskom prozoru:
inotifywatch -v -e create -e moved_to incoming
U drugom terminalskom prozoru ili kartici, pokušajmo da kreiramo novu datoteku, promenimo njen sadržaj, a zatim prebacimo datoteku sa druge lokacije u ciljni direktorijum. Sve ove komande se izvršavaju iz matičnog direktorijuma.
touch incoming/kreirana echo Testing123 >> incoming/kreirana touch /tmp/kreirana2 mv /tmp/kreirana2 incoming/
Vratite se na prvi terminalski prozor i zaustavite inotifywatch pritiskom na CTRL+C. Videćemo sledeći izlaz:
Evidentirana su samo dva događaja: kreiranje datoteke pod nazivom „kreirana“ i premeštanje postojeće datoteke nazvane „kreirana2“. Sve ostalo, poput izmene datoteke „kreirana“, je ignorisano.
Praćenje direktorijuma i izvršavanje zadataka
Sada kada znamo koje događaje treba pratiti, možemo upotrebiti drugi alat nazvan inotifywait, da blokiramo izvršavanje dok se datoteka ne kreira ili premesti u naš ciljni direktorijum. Koristićemo iste argumente kao i sa inotifywatch, i takođe navesti kako želimo da se formatira ime datoteke za upotrebu u našem zadatku.
Pre nego što počnemo, potreban nam je direktorijum za smeštanje datoteka koje su već obrađene. Kreirajte direktorijum pod nazivom „obradjeno“:
mkdir processed
Zatim napravite novu skriptu pod nazivom „prati-dolazne.sh“ i dodajte sledeći sadržaj:
#!/bin/bash TARGET=~/incoming/ PROCESSED=~/processed/ inotifywait -m -e create -e moved_to --format "%f" $TARGET | while read FILENAME do echo Detektovana $FILENAME, premeštanje i zipovanje mv "$TARGET/$FILENAME" "$PROCESSED/$FILENAME" gzip "$PROCESSED/$FILENAME" done
Skripta izvršava komandu inotifywait sa opcijom -m, što omogućava da komanda neprestano prati promene. Svaki put kada se otkrije novi događaj, ime datoteke se prosleđuje komandi read i smešta u promenljivu „FILENAME“. Izvršava se blok unutar while petlje, u kojem se datoteka prvo premešta u direktorijum „obradjeno“, a zatim se kompresuje gzip-om. Originalna datoteka se zamenjuje kompresovanom datotekom, a ime datoteke će se završavati sa „.gz“.
Dodajmo dozvole za izvršavanje ovoj skripti i pokrenimo je iz našeg matičnog direktorijuma.
chmod u+x prati-dolazne.sh ./prati-dolazne.sh
Otvorite drugi terminalski prozor i kreirajte novu datoteku u „dolazni“ direktorijum. Ispišite sadržaj direktorijuma „dolazni“ i „obradjeno“ da vidite rezultate otkrivenog događaja:
Skripta je detektovala neobrađenu tekstualnu datoteku koju smo kopirali u „dolazni“ direktorijum, prebacila je u „obradjeno“ i zatim kompresovala pomoću gzip-a.
Sada možemo izvoditi razne zanimljive zadatke kada možemo da pratimo nove datoteke koje stižu u direktorijum. Na primer, mogli bismo dodati vodeni žig na slikovne datoteke, kompresovati neobrađene video zapise u MP4 format, pa čak i otpremati svaku novu datoteku koju vidimo u Amazon S3 skladište. Ova skripta predstavlja dobar početak za pokretanje sopstvenih radnih tokova i automatizaciju uobičajenih zadataka na vašem sistemu.