web-dev-qa-db-fra.com

Détection continue de nouveaux fichiers avec inotify-tools dans plusieurs répertoires de manière récursive

Je viens d'installer inotify-tools. Je souhaite détecter en permanence de nouveaux fichiers avec des outils de notification dans plusieurs répertoires de manière récursive et envoyer un courrier électronique à l'aide de postfix. Je peux probablement gérer l'envoi d'un email en utilisant une partie de postfix. J'essaie simplement de trouver la meilleure façon de s'y prendre lorsque j'essaie de détecter de nouveaux fichiers. Parce que parfois plusieurs fichiers sont ajoutés à la fois.

12
David Custer

inotifywait (une partie de inotify-tools ) est le bon outil pour atteindre votre objectif, peu importe que plusieurs fichiers sont créés en même temps, il les détectera.

Voici un exemple de script:

#!/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" "[email protected]"
done

inotifywait utilisera ces options.

- m pour surveiller le répertoire indéfiniment. Si vous n'utilisez pas cette option, le script se terminera une fois qu'il aura détecté un nouveau fichier.

- r surveillera les fichiers de manière récursive (s'il y a beaucoup de répertoires/fichiers, la détection des nouveaux fichiers créés peut prendre un certain temps)

- e create est l'option permettant de spécifier l'événement à surveiller. Dans votre cas, il devrait être create pour gérer les nouveaux fichiers.

- le format '% w% f' imprimera le fichier au format /complete/path/file.name

"$ {MONITORDIR}" est la variable contenant le chemin à surveiller que nous avons défini auparavant.

Ainsi, dans le cas où un nouveau fichier est créé, , inotifywait le détectera et imprimera le résultat (/complete/path/file.name) sur le canal et while assignera cette sortie à la variable NEWFILE .

Dans la boucle while, vous verrez un moyen d'envoyer un courrier à votre adresse à l'aide de l'utilitaire mailx qui devrait fonctionner correctement avec votre MTA local (dans votre cas, Postfix).

Si vous souhaitez surveiller plusieurs répertoires, inotifywait ne l'autorise pas, mais vous avez deux options: créez un script pour chaque répertoire afin de surveiller ou de créer une fonction dans le script, par exemple:

#!/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" "[email protected]"
done
}
monitor "$MONITORDIR1" &
monitor "$MONITORDIR2" &
monitor "$MONITORDIRX" &
33
sahsanu

Utilisez inotifywait , par exemple:

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

Pour plus d'informations et d'exemples, voir l'article
Comment utiliser inotify-tools pour déclencher des scripts sur des événements de système de fichiers .

8
harrymc

Pour plusieurs annuaires, vous pouvez faire ceci:

#!/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" "[email protected]"
  done
          }


monitor &

Voici un exemple de liste de dossiers dans le fichier /etc/default/inotifywait /etc/default/inotifywait

/home/user1
/path/to/folder2/
/some/path/
0
Konstantin Frank