Како извршити задатак када се нова датотека дода у директоријум у Линуку

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.