Feladat végrehajtása, ha új fájl kerül hozzáadásra egy könyvtárhoz Linux alatt

Ez az oktatóanyag bemutatja, hogyan használhatja a Linux fájlrendszer eseményeit (értesítést), hogy minden alkalommal értesítést kapjon, amikor egy fájl megjelenik egy könyvtárban. Ezeket triggerekként használhatja a rendszer általános feladatainak automatizálására.

Írni fogunk egy szkriptet, amely figyel egy könyvtárat, és a hozzáadott új fájlokra hat. A rendszer minden fájlt gzip-be tömörít, és egy másik könyvtárba helyezi át, amint észleli. A szkript az inotify alrendszert használja az inotify-tools nevű segédprogramon keresztül. De először telepítsük az eszközt és kísérletezzünk.

Az inotify-tools és a gzip telepítése

Az apt-get segítségével telepítse ezt a csomagot a rendszerére, ha Ubuntut vagy más Debian-alapú disztribúciót használ. Más Linux disztribúciók esetén használja inkább a Linux disztribúció csomagkezelő eszközét.

sudo apt-get install inotify-tools gzip

Kísérletezés az inotify-eszközökkel

Kezdjük azzal, hogy nézzünk meg egy könyvtárat, és nézzük meg, milyen események indulnak el, amikor új fájlok érkeznek. Az inotifywatch nevű eszközt fogjuk használni, amely az inotify-tools része. Hozzon létre egy új könyvtárat „bejövő” néven:

mkdir incoming

Kezdje el nézni ezt a könyvtárat a következő parancs végrehajtásával:

inotifywatch -v incoming

Ez arra utasítja az inotify-t, hogy figyeljen minden fájlrendszer-eseményt a „bejövő” könyvtárban. A -v kapcsolóval az eszköz extra információkat nyomtat ki arról, hogy mit csinál. Nem adtunk meg időtúllépési opciót (-t ), és a parancs addig gyűjti az eseményeket, amíg ki nem lépünk a CTRL+C billentyűkombinációval. Ezen a ponton a terminálunknak valahogy így kell kinéznie:

Nyisson meg egy új terminálablakot (vagy lapot), és váltson át a bejövő üzenetek könyvtárára. A touch paranccsal hozzon létre egy új fájlt „newfile” néven.

cd incoming/
touch newfile

Most térjen vissza az első terminálablakhoz, és állítsa le az inotifywatch-ot a CTRL+C megnyomásával.

Az események táblázata megjelenik a konzolon, amely a „create”, „open”, „attrib” és „close_write” egy példányát jelzi. Ez a négy esemény akkor következett be, amikor érintéssel hoztunk létre egy új fájlt, beállítottuk a fájl hozzáférési attribútumait, megnyitottuk egy nulla záró karakter írásához, majd bezártuk. Ez csak néhány az események sokaságából, amelyek egy fájlrendszeren az inotify-eszközökkel figyelhetők. A teljes listát az inotifywatch főoldalán láthatja.

Célunkból csak két eseményre vagyunk kíváncsiak:

„létrehozás” – amikor egy fájl létrejön a célkönyvtárban.
„moved_to” – amikor egy fájlt egy másik helyről a célkönyvtárba helyeznek át.

Próbáljuk meg újra az inotifywatch-ot, de ezúttal arra utasítjuk, hogy csak ezt a két eseményt figyelje. Futtassa ezt a parancsot az első terminálablakban:

inotifywatch -v -e create -e moved_to incoming

A második terminálablakban vagy lapon próbáljunk meg új fájlt létrehozni, módosítani a tartalmát, majd áthelyezni a fájlt egy másik helyről a célkönyvtárba. Mindezek a parancsok a saját könyvtárból futnak.

touch incoming/created
echo Testing123 >> incoming/created
touch /tmp/created2
mv /tmp/created2 incoming/

Menjen vissza az első terminálablakba, és állítsa le az inotifywatch-ot a CTRL+C lenyomásával. A következő kimenetet fogjuk látni:

Csak két eseményt számoltunk: egy „created.txt” nevű fájl létrehozását és egy „created2.txt” nevű meglévő fájl áthelyezését. Minden mást, például a „created.txt” módosítását figyelmen kívül hagyta.

Könyvtár megtekintése és feladat végrehajtása

Most, hogy tudjuk, milyen eseményeket kell követnünk, egy másik inotifywait nevű eszközzel blokkolhatjuk a végrehajtást, amíg egy fájl létre nem jön a célkönyvtárunkban, vagy átkerül a célkönyvtárba. Ugyanazokat az argumentumokat fogjuk használni, mint az inotifywatch esetében, és azt is megadjuk, hogy a fájlnevet hogyan szeretnénk formázni a feladatunkhoz.

Mielőtt elkezdenénk, szükségünk van egy könyvtárra a már feldolgozott fájlok tárolására. Hozzon létre egy „feldolgozott” nevű könyvtárat:

mkdir processed

Ezután hozzon létre egy új szkriptet „watch-incoming.sh” néven, és adja hozzá az alábbi tartalmat:

#!/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

A szkript végrehajtja az inotifywait parancsot a -m kapcsolóval. Ezáltal a parancs korlátlan ideig figyeli a változásokat. Minden alkalommal, amikor a rendszer új eseményt észlel, a fájlnevet átadja az olvasási parancsnak, és beadja a „FILENAME” változóba. A while ciklus alatti blokk végrehajtásra kerül, amelyben a fájl először a „feldolgozott” könyvtárba kerül, majd gzip-be rakja. Az eredeti fájl helyére a tömörített fájl kerül, és a fájlnév „.gz”-re végződik.

Adjunk végrehajtási engedélyeket ehhez a szkripthez, és futtassuk a saját könyvtárunkból.

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

Nyissa meg a második terminálablakot, és hozzon létre egy új fájlt a „bejövő” könyvtárban. Sorolja fel mind a „bejövő” és a „feldolgozott” könyvtár tartalmát, hogy megtekinthesse az észlelt esemény eredményeit:

A „bejövő” könyvtárba másolt nyers szövegfájlt a szkript észlelte, a „feldolgozott” mappába másolta, majd a gzip segítségével tömörítette.

Érdekes feladatokat végezhetünk most, hogy figyelhetjük, nem érkeznek-e új fájlok egy könyvtárba. Például hozzáadhatunk vízjelet a képfájlokhoz, a nyers videókat mp4 formátumba tömöríthetjük, és akár minden új fájlt is feltölthetünk egy Amazon S3 tárolóba. Ez a szkript jó kiindulópont a saját munkafolyamatainak gördítéséhez és a rendszer általános feladatainak automatizálásához.