Acest ghid vă va explica cum să folosiți funcționalitățile de monitorizare a sistemului de fișiere din Linux (inotify) pentru a primi alerte ori de câte ori un fișier nou apare într-un anumit dosar. Aceste alerte pot fi folosite ca punct de pornire pentru a automatiza diferite operațiuni pe calculatorul dumneavoastră.
Vom crea un script care va supraveghea un dosar și va reacționa la apariția de fișiere noi. Fiecare fișier nou descoperit va fi comprimat prin metoda gzip și mutat într-un alt dosar. Pentru a face acest lucru, scriptul se bazează pe subsistemul inotify, accesibil prin intermediul utilitarului inotify-tools. Însă, înainte de a scrie scriptul, vom instala acest instrument și vom face câteva teste.
Instalarea inotify-tools și a gzip
Pentru utilizatorii Ubuntu sau ai altor distribuții bazate pe Debian, comanda apt-get este cea mai simplă metodă de a instala pachetul necesar. Dacă folosiți altă distribuție Linux, folosiți mecanismul de gestionare a pachetelor specific acelei distribuții.
sudo apt-get install inotify-tools gzip
Explorarea inotify-tools
Înainte de a începe să scriem scriptul, vom efectua câteva teste pentru a vedea ce evenimente sunt declanșate când apar fișiere noi. Pentru aceasta vom folosi inotifywatch, o unealtă din pachetul inotify-tools. Începem prin crearea unui dosar nou, denumit „incoming”:
mkdir incoming
Apoi, vom începe monitorizarea acestui dosar cu următoarea comandă:
inotifywatch -v incoming
Această comandă va instrui inotify să urmărească toate evenimentele sistemului de fișiere care au loc în dosarul „incoming”. Opțiunea -v face ca unealta să afișeze informații detaliate despre acțiunile pe care le execută. Comanda va continua să monitorizeze evenimentele până când oprim manual procesul cu CTRL+C, deoarece nu am specificat un interval de timp limită (-t). În acest moment, terminalul dumneavoastră ar trebui să arate similar cu:
Acum, deschideți o nouă fereastră de terminal (sau filă) și navigați la dosarul „incoming”. Folosiți comanda touch pentru a genera un nou fișier, numit „newfile”.
cd incoming/ touch newfile
Reveniți la prima fereastră de terminal și opriți inotifywatch, apăsând CTRL+C.
În consolă va fi afișat un tabel cu evenimentele detectate, printre care veți vedea „create”, „open”, „attribure” și „close_write”. Aceste patru evenimente s-au petrecut atunci când am folosit comanda touch pentru a crea un fișier nou, am stabilit atributele de acces, am deschis fișierul pentru a adăuga un caracter de terminare nul și apoi l-am închis. Acestea sunt doar câteva dintre evenimentele pe care inotify-tools le poate monitoriza. O listă completă a evenimentelor poate fi consultată în pagina de manual a inotifywatch.
Pentru scopurile noastre, ne vor interesa doar două evenimente:
„create” – când un fișier este creat în dosarul țintă.
„moved_to” – când un fișier este mutat dintr-o altă locație în dosarul țintă.
Vom rula din nou inotifywatch, dar de data aceasta vom specifica monitorizarea doar a acestor două evenimente. Introduceți următoarea comandă în prima fereastră de terminal:
inotifywatch -v -e create -e moved_to incoming
În cea de-a doua fereastră sau filă de terminal, vom crea un fișier nou, îi vom schimba conținutul și apoi vom muta un alt fișier în dosarul țintă. Toate aceste comenzi vor fi executate din dosarul principal.
touch incoming/created echo Testing123 >> incoming/created touch /tmp/created2 mv /tmp/created2 incoming/
Reveniți la prima fereastră de terminal și opriți inotifywatch cu CTRL+C. Veți vedea următorul rezultat:
S-au contorizat doar două evenimente: crearea fișierului „created” și mutarea fișierului „created2”. Orice altă acțiune, cum ar fi modificarea fișierului „created”, a fost ignorată.
Monitorizarea unui dosar și executarea unei acțiuni
Acum că știm ce evenimente să urmărim, putem folosi un instrument similar, numit inotifywait, pentru a bloca execuția scriptului până când un fișier este creat sau mutat în dosarul țintă. Vom folosi aceleași argumente ca la inotifywatch și vom specifica modul în care dorim să fie formatat numele fișierului pentru a fi folosit în sarcina noastră.
Înainte de a continua, vom avea nevoie de un dosar pentru a stoca fișierele care au fost deja procesate. Vom crea un dosar numit „processed”:
mkdir processed
În continuare, creăm un nou script, denumit „watch-incoming.sh” și adăugăm codul de mai jos:
#!/bin/bash TARGET=~/incoming/ PROCESSED=~/processed/ inotifywait -m -e create -e moved_to --format "%f" $TARGET | while read FILENAME do echo Detected $FILENAME, moving and zipping mv "$TARGET/$FILENAME" "$PROCESSED/$FILENAME" gzip "$PROCESSED/$FILENAME" done
Scriptul rulează comanda inotifywait cu opțiunea -m. Acest lucru face ca monitorizarea să continue la infinit. De fiecare dată când se detectează un eveniment nou, numele fișierului este trimis comenzii read și stocat în variabila „FILENAME”. Blocul de instrucțiuni din interiorul buclei while este executat, mutând mai întâi fișierul în dosarul „processed”, apoi compresându-l folosind gzip. Fișierul original este înlocuit cu cel comprimat, având extensia „.gz”.
Vom acorda permisiuni de execuție scriptului și îl vom rula din dosarul principal.
chmod u+x watch-incoming.sh ./watch-incoming.sh
Acum, deschideți o a doua fereastră de terminal și creați un fișier nou în dosarul „incoming”. Folosiți comanda ls pentru a vedea conținutul dosarelor „incoming” și „processed” și rezultatele evenimentului monitorizat.
Fișierul text nou creat în dosarul „incoming” a fost detectat de script, copiat în „processed” și apoi comprimat folosind gzip.
Acum, că putem monitoriza apariția fișierelor noi într-un dosar, putem executa o varietate de operațiuni utile. De exemplu, putem adăuga un filigran la imagini, putem converti fișiere video brute în format mp4 sau putem chiar încărca fiecare fișier nou într-un bucket Amazon S3. Acest script reprezintă un punct bun de pornire pentru a crea propriile fluxuri de lucru și a automatiza sarcinile comune pe sistemul dumneavoastră.