Deze tutorial laat je zien hoe je Linux-bestandssysteemgebeurtenissen gebruikt (notificatie) om elke keer dat een bestand in een map verschijnt, op de hoogte te worden gebracht. U kunt deze gebruiken als triggers om veelvoorkomende taken op uw systeem te automatiseren.
We gaan een script schrijven dat een directory bewaakt en reageert op nieuwe bestanden die worden toegevoegd. Elk bestand wordt gzipped en naar een andere map verplaatst, zodra het wordt gedetecteerd. Het script gebruikt het inotify-subsysteem, via een hulpprogramma genaamd inotify-tools. Maar laten we eerst de tool installeren en experimenteren.
Inotify-tools en gzip installeren
Gebruik apt-get
om dit pakket op uw systeem te installeren als u Ubuntu of een andere op Debian gebaseerde distributie gebruikt. Gebruik op andere Linux-distributies de pakketbeheertool van je Linux-distributie.
sudo apt-get install inotify-tools gzip
Experimenteren met inotify-tools
Laten we beginnen met het bekijken van een map en kijken welke gebeurtenissen beginnen wanneer nieuwe bestanden binnenkomen. We zullen een tool gebruiken genaamd inotifywatch
, dat deel uitmaakt van inotify-tools. Maak een nieuwe map met de naam “inkomend”:
mkdir incoming
Begin met het bekijken van deze map door de volgende opdracht uit te voeren:
inotifywatch -v incoming
Dit zal inotify instrueren om te kijken naar alle bestandssysteemgebeurtenissen in de “inkomende” directory. De -v
optie zorgt ervoor dat de tool extra informatie afdrukt over wat het doet. We hebben geen time-outoptie gespecificeerd (-t
), en het commando zal gebeurtenissen blijven verzamelen totdat we afsluiten met CTRL + C. Op dit punt zou onze terminal er ongeveer zo uit moeten zien:
Open een nieuw terminalvenster (of tabblad) en ga naar de inkomende map. Gebruik de touch-opdracht om een ​​nieuw bestand met de naam “newfile” te maken.
cd incoming/ touch newfile
Ga nu terug naar het eerste terminalvenster en stop inotifywatch door op CTRL + C te drukken.
Er wordt een tabel met gebeurtenissen naar de console gestuurd, die één instantie aangeeft van ‘create’, ‘open’, ‘attrib’ en ‘close_write’. Deze vier gebeurtenissen deden zich voor toen we touch gebruikten om een ​​nieuw bestand te maken, de bestandstoegangsattributen ervan in te stellen, het openden om een ​​null-afsluitend teken te schrijven en het daarna weer sloten. Dit zijn slechts enkele van de veelheid aan gebeurtenissen die met inotify-tools op een bestandssysteem kunnen worden gecontroleerd. U kunt de volledige lijst bekijken op de hoofdpagina voor inotifywatch.
Voor onze doeleinden zijn we slechts geïnteresseerd in twee evenementen:
- “Create” – wanneer een bestand wordt aangemaakt in de doelmap.
- “Moving_to” – wanneer een bestand van een andere locatie naar de doelmap wordt verplaatst.
Laten we opnieuw proberen inotifywatch te proberen, maar deze keer instrueren we het alleen deze twee gebeurtenissen te volgen. Voer deze opdracht uit in het eerste terminalvenster:
inotifywatch -v -e create -e moved_to incoming
Laten we in het tweede terminalvenster of tabblad proberen een nieuw bestand te maken, de inhoud ervan te wijzigen en het bestand vervolgens van een andere locatie naar de doelmap te verplaatsen. Al deze opdrachten worden uitgevoerd vanuit de homedirectory.
touch incoming/created echo Testing123 >> incoming/created touch /tmp/created2 mv /tmp/created2 incoming/
Ga terug naar het eerste terminalvenster en stop inotifywatch door op CTRL + C te drukken. We zullen de volgende output zien:
Er werden slechts twee gebeurtenissen geteld: het aanmaken van een bestand met de naam “created.txt” en het verplaatsen van een bestaand bestand met de naam “created2.txt”. Al het andere, zoals het wijzigen van “created.txt”, werd genegeerd.
Een directory bekijken en een taak uitvoeren
Nu we weten welke gebeurtenissen we moeten volgen, kunnen we een andere tool gebruiken, genaamd inotifywait
om de uitvoering te blokkeren totdat een bestand is gemaakt in of verplaatst naar onze doelmap. We gebruiken dezelfde argumenten als met inotifywatch en specificeren ook hoe we de bestandsnaam willen opmaken voor gebruik in onze taak.
Voordat we beginnen, hebben we een map nodig voor bestanden die al zijn verwerkt. Maak een map met de naam “verwerkt”:
mkdir processed
Maak vervolgens een nieuw script met de naam “watch-incoming.sh” en voeg de onderstaande inhoud toe:
#!/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
Het script voert het inotifywait
commando met de -m
optie. Hierdoor verandert de opdrachtmonitor voor onbepaalde tijd. Elke keer dat een nieuwe gebeurtenis wordt gedetecteerd, wordt de bestandsnaam doorgegeven aan het leescommando en geïnjecteerd in de “FILENAME” variabele. Het blok onder de while-lus wordt uitgevoerd, waarin het bestand eerst naar de “bewerkte” directory wordt verplaatst en vervolgens wordt gzipt. Het originele bestand wordt vervangen door het gecomprimeerde bestand en de bestandsnaam eindigt op “.gz”.
Laten we toestemming geven voor het uitvoeren van dit script en het uitvoeren vanuit onze homedirectory.
chmod u+x watch-incoming.sh ./watch-incoming.sh
Open het tweede terminalvenster en maak een nieuw bestand in de “inkomende” map. Maak een lijst van de inhoud van zowel de “inkomende” als de “verwerkte” map om de resultaten van de gedetecteerde gebeurtenis te zien:
Het onbewerkte tekstbestand dat we naar de “inkomende” map hebben gekopieerd, werd gedetecteerd door het script, gekopieerd naar “verwerkt” en vervolgens gecomprimeerd met gzip.
We kunnen een aantal interessante taken uitvoeren nu we kunnen kijken naar nieuwe bestanden die in een map aankomen. We kunnen bijvoorbeeld een watermerk toevoegen aan afbeeldingsbestanden, onbewerkte video’s comprimeren naar mp4-indeling en zelfs elk nieuw bestand dat we zien uploaden naar een Amazon S3-bucket. Dit script is een goed startpunt voor het rollen van uw eigen workflows en het automatiseren van algemene taken op uw systeem.