03/29/2024

Cum să efectuați o sarcină atunci când un fișier nou este adăugat la un director în Linux

Acest tutorial vă va arăta cum să utilizați evenimentele sistemului de fișiere Linux (notificare) pentru a primi notificări de fiecare dată când un fișier apare într-un director. Le puteți folosi ca declanșatori pentru a automatiza sarcinile obișnuite pe sistemul dvs.

Vom scrie un script care urmărește un director și acționează asupra fișierelor noi care sunt adăugate. Fiecare fișier este comprimat prin gzip și mutat în alt director, de îndată ce este detectat. Scriptul folosește subsistemul inotify, printr-un utilitar numit inotify-tools. Dar mai întâi, să instalăm instrumentul și să experimentăm.

Instalarea inotify-tools și gzip

Utilizați apt-get pentru a instala acest pachet pe sistemul dvs. dacă utilizați Ubuntu sau o altă distribuție bazată pe Debian. Pe alte distribuții Linux, utilizați instrumentul de gestionare a pachetelor din distribuția dvs. Linux.

sudo apt-get install inotify-tools gzip

Experimentarea cu inotify-tools

Să începem prin a urmări un director și a vedea ce evenimente inițiază când sosesc fișiere noi. Vom folosi un instrument numit inotifywatch , care face parte din inotify-tools. Creați un nou director numit „incoming”:

mkdir incoming

Începeți să urmăriți acest director executând următoarea comandă:

inotifywatch -v incoming

Acest lucru va instrui inotify să urmărească toate evenimentele sistemului de fișiere din directorul „incoming”. Opțiunea -v face ca instrumentul să imprime informații suplimentare despre ceea ce face. Nu am specificat o opțiune de timeout (-t ), iar comanda va continua să adune evenimente până când ieșim cu CTRL+C. În acest moment, terminalul nostru ar trebui să arate cam așa:

  Cum să utilizați pluginul Chrome Flash în Firefox pe Linux

Deschideți o nouă fereastră de terminal (sau filă) și treceți la directorul de intrare. Folosiți comanda tactilă pentru a crea un fișier nou numit „fișier nou”.

cd incoming/
touch newfile

Acum reveniți la prima fereastră de terminal și opriți inotifywatch apăsând CTRL+C.

Un tabel de evenimente va fi difuzat în consolă, indicând o instanță de „creare”, „deschidere”, „attribure” și „închidere_scriere”. Aceste patru evenimente au avut loc atunci când am folosit touch pentru a crea un fișier nou, am stabilit atributele de acces la fișiere, l-am deschis pentru a scrie un caracter de terminare nul și apoi l-am închis. Acestea sunt doar câteva dintre multitudinea de evenimente care pot fi monitorizate pe un sistem de fișiere cu inotify-tools. Puteți vedea lista completă pe pagina principală pentru inotifywatch.

Pentru scopurile noastre, suntem interesați doar de două evenimente:

„create” – când un fișier este creat în directorul țintă.
„moved_to” – când un fișier este mutat dintr-o altă locație în directorul țintă.

Să încercăm din nou inotifywatch, dar de data aceasta instruindu-i să monitorizeze doar aceste două evenimente. Rulați această comandă în prima fereastră de terminal:

inotifywatch -v -e create -e moved_to incoming

În a doua fereastră sau filă de terminal, să încercăm să creăm un fișier nou, să îi schimbăm conținutul și apoi să mutăm fișierul dintr-o altă locație în directorul țintă. Toate aceste comenzi sunt executate din directorul 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 apăsând CTRL+C. Vom vedea următoarea ieșire:

Au fost numărate doar două evenimente: crearea unui fișier numit „created.txt” și mutarea unui fișier existent numit „created2.txt”. Orice altceva, cum ar fi modificarea „created.txt”, a fost ignorat.

  Cum să utilizați comanda timeout pe Linux

Vizionarea unui director și executarea unei sarcini

Acum că știm ce evenimente să urmăm, putem folosi un alt instrument numit inotifywait pentru a bloca execuția până când un fișier este creat sau mutat în directorul nostru țintă. Vom folosi aceleași argumente ca și cu inotifywatch și, de asemenea, vom specifica modul în care dorim ca numele fișierului să fie formatat pentru a fi utilizat în sarcina noastră.

Înainte de a începe, avem nevoie de un director pentru a păstra fișierele care au fost deja procesate. Creați un director numit „procesat”:

mkdir processed

Apoi, creați un nou script numit „watch-incoming.sh” și adăugați conținutul enumerat 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 execută comanda inotifywait cu opțiunea -m. Acest lucru face ca monitorul de comandă să se modifice la infinit. De fiecare dată când este detectat un nou eveniment, numele fișierului este transmis comenzii de citire și injectat în variabila „FILENAME”. Se execută blocul de sub bucla while, în care fișierul este mai întâi mutat în directorul „procesat” și apoi gzip. Fișierul original este înlocuit cu fișierul comprimat, iar numele fișierului se va termina în „.gz”.

Să acordăm permisiuni de execuție pentru acest script și să-l rulăm din directorul nostru principal.

chmod u+x watch-incoming.sh
./watch-incoming.sh

Deschideți a doua fereastră de terminal și creați un fișier nou în directorul „incoming”. Listați conținutul directorului „intrat” și „procesat” pentru a vedea rezultatele evenimentului detectat:

Fișierul text brut pe care l-am copiat în directorul „incoming” a fost detectat de script, copiat în „processed” și apoi comprimat folosind gzip.

  6 aplicații utile pentru linia de comandă Linux de instalat

Putem face niște sarcini interesante acum că suntem capabili să urmărim fișierele noi care sosesc într-un director. De exemplu, am putea adăuga un filigran la fișierele de imagine, am putea comprima videoclipuri brute în format mp4 și chiar să încărcăm fiecare fișier nou pe care îl vedem într-o găleată Amazon S3. Acest script este un bun punct de plecare pentru rularea propriilor fluxuri de lucru și automatizarea sarcinilor comune pe sistemul dumneavoastră.