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.
Tartalomjegyzék
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.