Come Eseguire un Compito, Quando viene Aggiunto un Nuovo File in una Directory in Linux

0
405
Fatmawati Achmad Zaenuri/Shutterstock.com

Questo tutorial vi mostrerà come utilizzare il filesystem di Linux eventi (notifica) per ottenere una notifica ogni volta che viene visualizzato un file in una directory. Si potrebbe utilizzare questi come trigger per automatizzare le attività comuni nel sistema.

Abbiamo intenzione di scrivere uno script che controlla una directory e agisce su tutti i nuovi file che vengono aggiunti. Ogni file è compresso con gzip e spostati in un’altra directory, non appena viene rilevato. Lo script utilizza il inotify sottosistema, tramite un programma di utilità chiamato inotify-tools. Ma prima, diamo installare lo strumento di esperimento.

L’installazione di inotify-strumenti e gzip

L’uso di apt-get per installare questo pacchetto sul vostro sistema se si sta utilizzando Ubuntu o un’altra distribuzione basata su Debian. Su altre distribuzioni Linux, usare la vostra distribuzione di Linux strumento di gestione dei pacchetti, invece.

sudo apt-get install inotify-strumenti gzip

Sperimentare con inotify-strumenti

Cominciamo guardando una directory e di vedere quali eventi avviare nuovi file arrivare. Utilizzeremo uno strumento chiamato inotifywatch , che è parte di inotify-tools. Creare una nuova directory chiamata “in entrata”:

mkdir in arrivo

Iniziare a guardare questa directory eseguendo il seguente comando:

inotifywatch -v in arrivo

Questo indicherà inotify a guardare per tutti i filesystem eventi in directory “incoming”. L’opzione-v rende lo strumento di stampa ulteriori informazioni su ciò che sta facendo. Non abbiamo specificato una opzione di timeout (-t ), e il comando mantenere la raccolta di eventi fino a quando ci esci con CTRL+C. A questo punto, il nostro terminale dovrebbe essere qualcosa di simile a questo:

Aprire una nuova finestra di terminale (o scheda) e cambiare la directory incoming. Utilizzare il comando touch per creare un nuovo file denominato “newfile.”

cd in arrivo/
toccare newfile

Ora torna alla prima finestra di terminale e stop inotifywatch premendo CTRL+C.

Una tabella degli eventi sarà servita per la console, che indica un’istanza di “creare”, “aperto”, “attrib” e “close_write.” Questi quattro eventi si è verificato quando abbiamo usato il tocco per creare un nuovo file, impostare il relativo accesso ai file di attributi, aperto per scrivere un carattere di terminazione null, e quindi chiuso in seguito. Questi sono solo alcuni della moltitudine di eventi che possono essere monitorati su un filesystem con inotify-tools. Si può vedere l’elenco completo nella pagina principale per inotifywatch.

Per i nostri scopi, siamo interessati solo a due eventi:

  • “creare” – quando un file viene creato nella directory di destinazione.
  • “moved_to” – quando un file viene spostato da un’altra posizione nella directory di destinazione.

Proviamo inotifywatch di nuovo, ma questa volta con l’istruzione di monitorare questi due eventi. Eseguire questo comando nella prima finestra di terminale:

inotifywatch -v-e creare -e moved_to in arrivo

Nella seconda finestra di terminale o scheda, proviamo a creare un nuovo file, cambiando il suo contenuto, e quindi spostare il file da un altro percorso per la directory di destinazione. Tutti questi comandi sono eseguiti dalla home directory.

touch in arrivo/creato
eco Testing123 >> in arrivo/creato
touch /tmp/created2
mv /tmp/created2 in arrivo/

Torna alla prima finestra di terminale e stop inotifywatch premendo CTRL+C. vedremo il seguente output:

Solo due eventi sono stati contati: la creazione di un file chiamato “created.txt” e lo spostamento di un file esistente denominato “created2.txt”. Tutto il resto, ad esempio la modifica “created.txt,” è stato ignorato.

Guardando una Directory e l’Esecuzione di un Compito

Ora che sappiamo quali sono gli eventi da seguire, possiamo utilizzare un altro strumento chiamato inotifywait per bloccare l’esecuzione fino a quando un file viene creato o spostato la nostra directory di destinazione. Useremo gli stessi argomenti, come abbiamo fatto con inotifywatch e anche specificare come si desidera che il nome del file deve essere formattato per l’uso nelle nostre attività.

Prima di iniziare, abbiamo bisogno di una directory che conterrà i file che sono già stati elaborati. Creare una directory chiamata “trattati”:

mkdir trattati

Successivamente, creare un nuovo script chiamato “watch-incoming.sh” e aggiungere il contenuto di seguito elencati:

#!/bin/bash

TARGET=~/in arrivo/
TRATTATI=~/elaborati/

inotifywait -m-p-o creare -e moved_to –formato “%f” $TARGET
| mentre leggere nome del file
fare
eco Rilevato $FILENAME, il movimento e la compressione
mv “$TARGET/$NOMEFILE” “$TRATTATI/$NOMEFILE”
gzip “$TRATTATI/$NOMEFILE”
fatto

Lo script esegue il inotifywait di comando con l’opzione-m. In questo modo il comando monitorare i cambiamenti a tempo indeterminato. Ogni volta che un nuovo evento viene rilevato, il suo nome è passato al comando di lettura e iniettato in “nome file” variabile. Il blocco sotto il ciclo while viene eseguito, in cui il file viene spostato in “trattati” directory e poi compresso con gzip. Il file originale viene sostituito con il file compresso, e il nome che termina in “.gz”.

Andiamo a concedere autorizzazioni eseguire questo script ed eseguirlo da casa nostra directory.

chmod u+x watch-incoming.sh
./watch-incoming.sh

Aperta la seconda finestra di terminale e creare un nuovo file nella directory “incoming”. Elencare il contenuto sia “in entrata” e “trattati” directory per visualizzare i risultati della manifestazione di essere rilevato:

Il raw file di testo che abbiamo copiato nella directory “incoming” è stato rilevato dallo script, copiato in “trattati” e poi compresso con gzip.

Possiamo fare alcune attività interessanti, ora che siamo in grado di guardare di nuovo i file in arrivo in una directory. Per esempio, si potrebbe aggiungere un watermark ai file di immagine, comprimere raw video in formato mp4 e anche caricare ogni nuovo file vediamo in un secchio Amazon S3. Questo script è un buon punto di partenza per rotolare i vostri flussi di lavoro e l’automatizzazione di attività comuni nel sistema.