Overvåk Linux-filer: Automatisér oppgaver med inotify!

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.