Hoe u een taak kunt uitvoeren wanneer een nieuw bestand wordt toegevoegd aan een directory in Linux

Bash-shell op Ubuntu pc-concept
Fatmawati Achmad Zaenuri / Shutterstock.com

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.

Nieuwste artikelen

spot_img

Related Stories

Leave A Reply

Vul alstublieft uw commentaar in!
Vul hier uw naam in