Denne opplæringen vil vise deg hvordan du bruker Linux-filsystemhendelser (varsle) for å bli varslet hver gang en fil vises i en katalog. Du kan bruke disse som utløsere for å automatisere vanlige oppgaver på systemet ditt.
Vi skal skrive et skript som overvåker en katalog og handler på nye filer som legges til. Hver fil blir gzippet og flyttet til en annen katalog så snart den oppdages. Skriptet bruker inotify-delsystemet, gjennom et verktøy kalt inotify-tools. Men først, la oss installere verktøyet og eksperimentere.
Innholdsfortegnelse
Installerer inotify-tools og gzip
Bruk apt-get for å installere denne pakken på systemet ditt hvis du bruker Ubuntu eller en annen Debian-basert distribusjon. På andre Linux-distribusjoner, bruk Linux-distribusjonens pakkehåndteringsverktøy i stedet.
sudo apt-get install inotify-tools gzip
Eksperimenterer med inotify-verktøy
La oss begynne med å se på en katalog og se hvilke hendelser som starter når nye filer kommer. Vi skal bruke et verktøy som heter inotifywatch , som er en del av inotify-tools. Opprett en ny katalog kalt «innkommende»:
mkdir incoming
Begynn å se på denne katalogen ved å utføre følgende kommando:
inotifywatch -v incoming
Dette vil be inotify om å se etter alle filsystemhendelser i «innkommende» katalogen. Alternativet -v gjør at verktøyet skriver ut ekstra informasjon om hva det gjør. Vi har ikke spesifisert et tidsavbruddsalternativ (-t ), og kommandoen vil fortsette å samle hendelser til vi avslutter med CTRL+C. På dette tidspunktet skal terminalen vår se omtrent slik ut:
Åpne et nytt terminalvindu (eller fane) og bytt til innkommende katalog. Bruk berøringskommandoen for å lage en ny fil med navnet «newfile.»
cd incoming/ touch newfile
Gå nå tilbake til det første terminalvinduet og stopp inotifywatch ved å trykke CTRL+C.
En tabell med hendelser vil bli servert til konsollen, som indikerer en forekomst av «opprett», «åpne», «attrib» og «lukk_skriv». Disse fire hendelsene skjedde da vi brukte berøring for å lage en ny fil, satte dens filtilgangsattributter, åpnet den for å skrive et null-avsluttende tegn og lukket den etterpå. Dette er bare noen av de mange hendelsene som kan overvåkes på et filsystem med inotify-verktøy. Du kan se hele listen på hovedsiden for inotifywatch.
For våre formål er vi kun interessert i to arrangementer:
«skape» – når en fil opprettes i målkatalogen.
«moved_to» – når en fil flyttes fra et annet sted til målkatalogen.
La oss prøve inotifywatch igjen, men denne gangen ber vi den om å bare overvåke disse to hendelsene. Kjør denne kommandoen i det første terminalvinduet:
inotifywatch -v -e create -e moved_to incoming
I det andre terminalvinduet eller -fanen, la oss prøve å lage en ny fil, endre innholdet og deretter flytte filen fra et annet sted til målkatalogen. Alle disse kommandoene kjøres fra hjemmekatalogen.
touch incoming/created echo Testing123 >> incoming/created touch /tmp/created2 mv /tmp/created2 incoming/
Gå tilbake til det første terminalvinduet og stopp inotifywatch ved å trykke CTRL+C. Vi vil se følgende utgang:
Bare to hendelser ble talt: opprette en fil kalt «created.txt» og flytte en eksisterende fil kalt «created2.txt». Alt annet, som å endre «created.txt», ble ignorert.
Se på en katalog og utføre en oppgave
Nå som vi vet hvilke hendelser vi skal følge, kan vi bruke et annet verktøy kalt inotifywait for å blokkere kjøring til en fil er opprettet i eller flyttet til målkatalogen vår. Vi bruker de samme argumentene som vi gjorde med inotifywatch og spesifiserer også hvordan vi vil at filnavnet skal formateres for bruk i oppgaven vår.
Før vi begynner, trenger vi en katalog for å inneholde filer som allerede er behandlet. Opprett en katalog kalt «behandlet»:
mkdir processed
Deretter oppretter du et nytt skript kalt «watch-incoming.sh» og legger til innholdet som er oppført nedenfor:
#!/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
Skriptet utfører inotifywait-kommandoen med alternativet -m. Dette gjør at kommandomonitoren endres på ubestemt tid. Hver gang en ny hendelse oppdages, sendes filnavnet til read-kommandoen og injiseres i «FILENAME»-variabelen. Blokken under while-løkken kjøres, hvor filen først flyttes til den «behandlede» katalogen og deretter gzippes. Den opprinnelige filen erstattes med den komprimerte filen, og filnavnet vil ende på «.gz».
La oss gi utføringstillatelser på dette skriptet og kjøre det fra hjemmekatalogen vår.
chmod u+x watch-incoming.sh ./watch-incoming.sh
Åpne det andre terminalvinduet og lag en ny fil i «innkommende» katalogen. List innholdet i både «innkommende» og «behandlet» katalogen for å se resultatene av hendelsen som oppdages:
Råtekstfilen som vi kopierte til «innkommende»-katalogen ble oppdaget av skriptet, kopiert til «behandlet» og deretter komprimert ved hjelp av gzip.
Vi kan gjøre noen interessante oppgaver nå som vi kan se etter nye filer som kommer inn i en katalog. For eksempel kan vi legge til et vannmerke til bildefiler, komprimere råvideoer til mp4-format og til og med laste opp hver nye fil vi ser til en Amazon S3-bøtte. Dette skriptet er et godt utgangspunkt for å rulle dine egne arbeidsflyter og automatisere vanlige oppgaver på systemet ditt.