Denne veiledningen demonstrerer hvordan du kan utnytte filsystemhendelser i Linux, også kjent som inotify, for å motta varsler når en ny fil dukker opp i en spesifikk mappe. Denne funksjonen kan fungere som en utløser for å automatisere rutineoppgaver på systemet ditt.
Vi skal utvikle et script som kontinuerlig overvåker en mappe og reagerer på nye filer som legges til. Hver fil vil automatisk bli komprimert med gzip og flyttet til en annen mappe umiddelbart etter at den er oppdaget. Scriptet benytter seg av inotify-undersystemet via et verktøy kalt inotify-tools. La oss først installere verktøyet og teste det.
Installasjon av inotify-tools og gzip
Dersom du bruker Ubuntu eller en annen Debian-basert distribusjon, kan du installere denne pakken ved hjelp av apt-get. For andre Linux-distribusjoner, bruk den respektive pakkebehandleren som følger med systemet ditt.
sudo apt-get install inotify-tools gzip
Eksperimentering med inotify-verktøy
La oss starte med å overvåke en mappe og se hvilke hendelser som oppstår når nye filer dukker opp. Vi bruker verktøyet inotifywatch, som er en del av inotify-tools. Lag en ny mappe med navnet «innkommende»:
mkdir incoming
Start overvåkingen av denne mappen ved å utføre følgende kommando:
inotifywatch -v incoming
Dette instruerer inotify om å overvåke alle filsystemhendelser i mappen «innkommende». Alternativet -v sørger for at verktøyet gir detaljert informasjon om sine operasjoner. Siden vi ikke har angitt et tidsavbrudd (-t), vil kommandoen fortsette å samle hendelser helt til vi avslutter den med CTRL+C. Terminalen din skal nå se omtrent slik ut:
Åpne et nytt terminalvindu eller en ny fane, og naviger til den «innkommende» mappen. Bruk kommandoen «touch» for å opprette en ny fil med navnet «nyfil».
cd incoming/ touch nyfil
Gå tilbake til det første terminalvinduet og stopp inotifywatch ved å trykke CTRL+C.
En tabell med hendelser vil nå vises i terminalen, og viser hendelsene «opprett», «åpne», «attrib» og «lukk_skriv». Disse fire hendelsene inntraff da vi brukte «touch»-kommandoen for å lage en ny fil, sette dens filtilgangsegenskaper, åpne den for å skrive et null-avsluttende tegn, og deretter lukke den. Dette er bare et lite utvalg av hendelsene som kan overvåkes på et filsystem med inotify-verktøy. Du kan finne den fullstendige listen på inotifywatch sin hovedside.
I vår sammenheng er vi kun interessert i to hendelser:
«opprett» – når en fil opprettes i den valgte mappen.
«flyttet_til» – når en fil flyttes fra en annen plassering til den valgte mappen.
La oss teste inotifywatch igjen, men denne gangen instruerer vi den om å kun overvåke disse to spesifikke hendelsene. Kjør denne kommandoen i det første terminalvinduet:
inotifywatch -v -e create -e moved_to incoming
I det andre terminalvinduet eller fanen, skal vi forsøke å opprette en ny fil, redigere innholdet, og deretter flytte filen fra en annen lokasjon til den overvåkede mappen. Alle disse kommandoene utføres fra hjemmemappen.
touch incoming/opprettet echo Test 123 >> incoming/opprettet touch /tmp/opprettet2 mv /tmp/opprettet2 incoming/
Gå tilbake til det første terminalvinduet og stopp inotifywatch ved å trykke CTRL+C. Du vil se følgende utdata:
Kun to hendelser ble registrert: opprettelsen av en fil med navnet «opprettet» og flyttingen av en eksisterende fil med navnet «opprettet2». Alle andre hendelser, som redigering av «opprettet», ble ignorert.
Overvåking av en mappe og utførelse av en oppgave
Nå som vi vet hvilke hendelser vi skal følge, kan vi bruke et annet verktøy kalt inotifywait for å blokkere utførelsen helt til en fil blir opprettet eller flyttet til vår valgte mappe. Vi bruker de samme argumentene som i inotifywatch, og spesifiserer også hvordan vi ønsker at filnavnet skal formateres for bruk i oppgaven vår.
Før vi begynner, trenger vi en mappe for å oppbevare allerede behandlede filer. Opprett en mappe med navnet «behandlet»:
mkdir processed
Deretter lager du et nytt script med navnet «overvåk-innkommende.sh» og legger til innholdet som er listet nedenfor:
#!/bin/bash TARGET=~/incoming/ PROCESSED=~/processed/ inotifywait -m -e create -e moved_to --format "%f" $TARGET | while read FILENAME do echo Oppdaget $FILENAME, flytter og komprimerer mv "$TARGET/$FILENAME" "$PROCESSED/$FILENAME" gzip "$PROCESSED/$FILENAME" done
Scriptet kjører inotifywait-kommandoen med -m-alternativet. Dette gjør at kommandoen overvåker endringer uendelig. Hver gang en ny hendelse oppdages, sendes filnavnet til read-kommandoen og settes inn i variabelen «FILENAME». Koden under while-løkken utføres, der filen først flyttes til mappen «behandlet» og deretter komprimeres med gzip. Den opprinnelige filen erstattes med den komprimerte filen, og filnavnet vil ende med «.gz».
La oss gi scriptet utførelsesrettigheter og kjøre det fra hjemmemappen vår.
chmod u+x overvåk-innkommende.sh ./overvåk-innkommende.sh
Åpne det andre terminalvinduet og opprett en ny fil i «innkommende»-mappen. Vis innholdet i både «innkommende» og «behandlet»-mappene for å se resultatene av den oppdagede hendelsen:
Den opprinnelige tekstfilen som vi kopierte til «innkommende»-mappen ble oppdaget av scriptet, kopiert til «behandlet» og deretter komprimert ved hjelp av gzip.
Vi kan nå utføre en rekke interessante oppgaver, siden vi kan overvåke nye filer som ankommer en mappe. For eksempel kan vi legge til et vannmerke på bildefiler, komprimere råvideoer til mp4-format, eller til og med laste opp hver nye fil vi ser til en Amazon S3-bøtte. Dette scriptet er et godt utgangspunkt for å utvikle dine egne arbeidsflyter og automatisere rutineoppgaver på systemet ditt.