Détecter en continu de nouveaux fichiers avec des outils inotify dans plusieurs répertoires de manière récursive

17

Je viens d'installer inotify-tools. Je voudrais détecter en permanence de nouveaux fichiers avec des outils de notification dans plusieurs répertoires de manière récursive et envoyer un e-mail en utilisant postfix. Je peux probablement gérer l'envoi d'un e-mail en utilisant la partie postfix. J'essaie simplement de trouver la meilleure façon de procéder lorsque vous essayez de détecter de nouveaux fichiers. Parce que parfois plusieurs fichiers sont ajoutés à la fois.

David Custer
la source

Réponses:

39

inotifywait (qui fait partie des outils inotify ) est le bon outil pour atteindre votre objectif, peu importe que plusieurs fichiers soient 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, une fois qu'il a détecté un nouveau fichier, le script se terminera.

-r surveillera les fichiers de manière récursive (s'il y a beaucoup de répertoires / fichiers, cela pourrait prendre un certain temps pour détecter les nouveaux fichiers créés)

-e create est la possibilité de spécifier l'événement à surveiller et dans votre cas, il doit être créé pour prendre soin des nouveaux fichiers

--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.

Donc, dans le cas où un nouveau fichier est créé, inotifywait le détectera et imprimera la sortie (/complete/path/file.name) dans le tube 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 voulez surveiller plusieurs répertoires, inotifywait ne le permet pas mais vous avez deux options, créez un script pour chaque dir à surveiller ou créez une fonction à l'intérieur du script, quelque chose comme ceci:

#!/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" &
sahsanu
la source
J'ai oublié d'ajouter plusieurs explications concernant les commandes utilisées dans l'exemple de script, c'est la raison pour modifier ma réponse ... J'ai également ajouté le script au cas où op souhaite surveiller plusieurs répertoires. En ce qui concerne l'outil inotifywait, il est impossible de répondre à la question sans le mentionner car op utilise inotify-tools. Soit dit en passant, je suis un novice ici, donc j'ai besoin d'apprendre beaucoup sur la netiquette, donc, désolé si ma réponse chevauche la vôtre, ce n'est pas ce que je veux, je veux juste donner une réponse complète à l'op. Encore désolé.
sahsanu
Pas de problème et bienvenue chez SU. L'apprentissage de la netiquette se fait généralement à la dure, car il n'est vraiment défini nulle part.
harrymc
4
@sahsanu Je ne suis pas d'accord sur tout le "netiquette". Chaque personne répond à la question de son propre point de vue. Il n'y a pas de chevauchement entre les réponses, ni de réponse qui a été réécrite. Il est impossible que les réponses diffèrent de cette manière lorsque la question est si spécifique. Merci beaucoup d'avoir pris le temps de répondre à la question en détail. Cela a aidé plus que vous ne le savez, pour quelqu'un comme moi qui apprend tout cela. Vous m'avez sauvé d'innombrables heures.
David Custer
1
@harrymc Netiquetta est défini ici.
David Custer
La netiquette dans un environnement évolutif ne peut pas être définie de manière absolue.Il est de coutume sur ce site de ne pas dupliquer les réponses sauf si elles sont mal écrites, et même dans ce cas, il est encouragé de les corriger à la place via l'édition. C'est toujours votre droit dans une communauté démocratique de ne pas être d'accord. @sahsanu aurait pu éviter ma remarque en se référant à ma réponse précédente tout en montrant son script, qui aurait de toute façon obtenu votre approbation. C'est ce que j'aurais fait à sa place et c'est ma nétiquette que je crois partager avec les autres (mais pas avec tout le monde bien sûr).
harrymc
8

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, consultez l'article
Comment utiliser les outils inotify pour déclencher des scripts sur des événements de système de fichiers .

harrymc
la source
1
Si quelqu'un utilise cela et convertit les variables de la lecture en majuscules, vous ne pourrez pas exécuter certaines commandes à l'intérieur du temps. C'est parce que vous écraseriez la variable $ PATH.
Savageman
2
@Savageman L'utilisation de noms de variables majuscules pour vos propres variables est fortement déconseillée précisément pour cette raison. Les noms de variables en majuscules sont réservés à l'utilisation du système; vos propres variables doivent utiliser des minuscules.
tripleee
@tripleee Merci pour l'info, n'utilisera plus les vars majuscules :)
Savageman
0

Pour plusieurs répertoires, vous pouvez le faire:

#!/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/
Konstantin Frank
la source