Rileva in modo ricorsivo nuovi file con inotify-tools all'interno di più directory


17

Ho appena installato inotify-tools. Vorrei rilevare continuamente nuovi file con strumenti di notifica all'interno di più directory in modo ricorsivo e inviare un'e-mail utilizzando postfix. Posso probabilmente gestire l'invio di un'e-mail utilizzando la parte postfix. Sto solo cercando di capire il modo migliore per farlo quando provo a rilevare nuovi file. Perché a volte vengono aggiunti più file contemporaneamente.

Risposte:


39

inotifywait (parte di inotify-tools ) è lo strumento giusto per raggiungere il tuo obiettivo, non importa che vengano creati più file contemporaneamente, li rileverà.

Ecco uno script di esempio:

#!/bin/sh
MONITORDIR="/path/to/the/dir/to/monitor/"
inotifywait -m -r -e create --format '%w%f' "${MONITORDIR}" | while read NEWFILE
do
        echo "This is the body of your mail" | mailx -s "File ${NEWFILE} has been created" "yourmail@addresshere.tld"
done

inotifywait utilizzerà queste opzioni.

-m per monitorare la directory indefinitamente, se non si utilizza questa opzione, una volta che ha rilevato un nuovo file lo script termina.

-r monitorerà i file in modo ricorsivo (se ci sono molti dirs / file potrebbe richiedere del tempo per rilevare i nuovi file creati)

-e create è l'opzione per specificare l'evento da monitorare e nel tuo caso dovrebbe essere creato per occuparsi dei nuovi file

--format '% w% f' stamperà il file nel formato /complete/path/file.name

"$ {MONITORDIR}" è la variabile che contiene il percorso da monitorare che abbiamo definito in precedenza.

Quindi, nel caso in cui venga creato un nuovo file, inotifywait lo rileverà e stamperà l'output (/complete/path/file.name) sulla pipe e mentre assegnerà quell'output alla variabile NEWFILE .

All'interno del ciclo while vedrai un modo per inviare una mail al tuo indirizzo usando l' utility mailx che dovrebbe funzionare bene con il tuo MTA locale (nel tuo caso, Postfix).

Se vuoi monitorare diverse directory, inotifywait non lo consente ma hai due opzioni, crea uno script per ogni dir per monitorare o crea una funzione all'interno dello script, qualcosa del genere:

#!/bin/sh
MONITORDIR1="/path/to/the/dir/to/monitor1/"
MONITORDIR2="/path/to/the/dir/to/monitor2/"
MONITORDIRX="/path/to/the/dir/to/monitorx/"    

monitor() {
inotifywait -m -r -e create --format "%f" "$1" | while read NEWFILE
do
        echo "This is the body of your mail" | mailx -s "File ${NEWFILE} has been created" "yourmail@addresshere.tld"
done
}
monitor "$MONITORDIR1" &
monitor "$MONITORDIR2" &
monitor "$MONITORDIRX" &

Ho dimenticato di aggiungere diverse spiegazioni relative ai comandi utilizzati nello script di esempio, ecco il motivo per modificare la mia risposta ... Ho anche aggiunto lo script nel caso op volesse monitorare diverse directory. Per quanto riguarda lo strumento inotifywait, è impossibile rispondere alla domanda senza menzionarla perché op utilizza inotify-tools. A proposito, sono un principiante qui, quindi ho bisogno di imparare molto sulla netiquette, quindi, scusami se la mia risposta si sovrappone alla tua, non era quello che volevo, voglio solo dare una risposta completa all'op. Ancora scusa.
sahsanu,

Nessun problema e benvenuto in SU. Imparare a conoscere la netiquette è di solito fatto nel modo più duro, in quanto non è definito da nessuna parte.
harrymc,

4
@sahsanu Non sono d'accordo sull'intera faccenda della "netiquette". Ogni persona sta rispondendo alla domanda da lì propria prospettiva. Non c'è sovrapposizione tra le risposte, né esiste una risposta che è stata riscritta. È impossibile che le risposte differiscano in quel modo quando la domanda è così specifica. Grazie mille per il tempo dedicato a rispondere alla domanda in modo molto dettagliato. Questo ha aiutato più di quanto tu sappia, per qualcuno come me che sta solo imparando tutto ciò. Mi hai risparmiato innumerevoli ore.
David Custer,


La netiquette in un ambiente in evoluzione non può essere definita in modo assoluto: in questo sito è consuetudine non duplicare le risposte se non sono scritte male, e anche in questo caso è incoraggiato a correggerle invece tramite la modifica. In una comunità democratica è sempre un tuo diritto non essere d'accordo. @sahsanu avrebbe potuto evitare la mia osservazione facendo riferimento alla mia precedente risposta mentre mostravo la sua sceneggiatura, che avrebbe ottenuto la tua approvazione in ogni caso. Questo è quello che avrei fatto al suo posto e questa è la mia netiquette, che credo di condividere con gli altri (ma non con tutti, ovviamente).
harrymc,

8

Utilizzare inotifywait , ad esempio:

inotifywait -m /path -e create -e moved_to |
    while read path action file; do
        echo "The file '$file' appeared in directory '$path' via '$action'"
        # do something with the file
    done

Per ulteriori informazioni ed esempi, consultare l'articolo
Come utilizzare inotify-tools per attivare script su eventi del filesystem .


1
Se qualcuno lo utilizza e converte le variabili dalla lettura in maiuscolo, non sarà possibile eseguire alcuni comandi nel frattempo. Questo perché sovrascriveresti la variabile $ PATH.
Savageman,

2
@Savageman L'uso di nomi di variabili maiuscole per le proprie variabili è fortemente sconsigliato proprio per questo motivo. I nomi delle variabili maiuscole sono riservati per l'uso del sistema; le tue variabili dovrebbero usare lettere minuscole.
Tripleee

@tripleee Grazie per le informazioni, non userò più i caratteri maiuscoli :)
Savageman

0

Per diverse directory puoi farlo:

#!/bin/bash


monitor() {
  inotifywait -m -r -e attrib --format "%w%f" --fromfile /etc/default/inotifywait | while read NEWFILE
  do
     echo "This is the body of your mail" | mailx -s "File ${NEWFILE} has been created" "yourmail@addresshere.tld"
  done
          }


monitor &

Ecco un esempio di elenco di cartelle nel file /etc/default/inotifywait /etc/default/inotifywait

/home/user1
/path/to/folder2/
/some/path/
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.