Pourquoi inotifywatch ne détecte-t-il pas les modifications des fichiers ajoutés?

14

J'essaie de surveiller mon /tmpdossier pour les changements en utilisant inotifywatch:

sudo inotifywatch -v -r /tmp

Après avoir créé quelques fichiers ( touch /tmp/test-1 /tmp/test-2), je termine inotifywatch(par Ctrl- Cce qui me montre les statistiques suivantes:

Establishing watches...
Setting up watch(es) on /tmp
OK, /tmp is now being watched.
Total of 39 watches.
Finished establishing watches, now collecting statistics.
total  attrib  close_write  open  create  filename
8      2       2            2     2       /tmp/

La sortie n'imprime que les statistiques, mais pas les fichiers que j'attendais (comme ici ou ici ). J'ai essayé différents types d'accès (via cat, mktempetc.), mais c'est la même chose.

Ai-je oublié quelque chose? C'est parce que je suis sur VPS et que quelque chose a été restreint?

OS: Debian 7.3 (inotify-tools) sur VPS

Kenorb
la source

Réponses:

14

Cela est dû à la façon dont vous utilisez inotifywatchet au fonctionnement de l'outil lui-même. Lorsque vous exécutez inotifywatch -r /tmp, vous commencez à regarder /tmpet tous les fichiers qui s'y trouvent déjà . Lorsque vous créez un fichier à l'intérieur /tmp, les métadonnées du répertoire sont mises à jour pour contenir le numéro d'inode du nouveau fichier, ce qui signifie que la modification se produit /tmp, non /tmp/test-1. De plus, comme il /tmp/test-1n'était pas là au inotifywatchdémarrage, aucune inotifymontre n'est placée dessus. Cela signifie que tout événement qui se produit sur un fichier créé après le placement des montres ne sera pas détecté . Vous le comprendrez peut-être mieux si vous le voyez vous-même:

$ inotifywatch -rv /tmp &
Total of n watches.
$ cat /sys/kernel/debug/tracing/trace | grep inotifywatch | wc -l
n

Si vous avez activé le mécanisme de traçageinotify_add_watch(2) , la dernière commande vous donnera le nombre de surveillances configurées par inotifywatch. Ce numéro doit être le même que celui donné par inotifywatchlui-même. Maintenant, créez un fichier à l'intérieur /tmpet vérifiez à nouveau:

$ inotifywatch -rv /tmp &
Total of n watches.
$ touch /tmp/test1.txt
$ cat /sys/kernel/debug/tracing/trace | grep inotifywatch | wc -l
n

Le nombre n'aura pas augmenté, ce qui signifie que le nouveau fichier n'est pas surveillé. Notez que le comportement est différent si vous créez un répertoire à la place:

$ inotifywatch -rv /tmp &
Total of n watches.
$ mkdir /tmp/test1
$ cat /sys/kernel/debug/tracing/trace | grep inotifywatch | wc -l
n + 1

Cela est dû à la façon dont le -rcommutateur se comporte :

-r, --recursive: [...] Si de nouveaux répertoires sont créés dans des répertoires surveillés, ils seront automatiquement surveillés.

Edit: Je suis un peu confus entre vos deux exemples, mais dans le premier cas , les montres sont correctement placé parce que les appels des utilisateurs inotifywatchsur ~/*(qui est expansées, voir le commentaire de don_crissti ici ). Le répertoire personnel est également surveillé car ~/.*contient ~/.. Théoriquement, il devrait également contenir ~/.., ce qui, combiné au -rcommutateur, devrait conduire à surveiller l'ensemble du système.

Cependant, il est possible d'obtenir le nom du fichier déclenchant un événement de création dans un répertoire surveillé, mais je suppose inotifywatchque ne récupère pas ces informations (il est enregistré un peu plus profondément que le nom du répertoire). inotify-toolsfournit un autre outil, appelé inotifywait, qui peut se comporter à peu près comme inotify-watch, et fournit plus d'options de sortie (y compris %f, ce que vous recherchez ici):

inotifywait -m --format "%e %f" /tmp

Depuis la page de manuel :

--format <fmt>Sortie dans un format spécifié par l'utilisateur, utilisant une syntaxe semblable à printf. [...] Les conversions suivantes sont prises en charge:

%f: lorsqu'un événement se produit dans un répertoire, il sera remplacé par le nom du fichier qui a provoqué l'événement .

%e: remplacé par le ou les événements qui se sont produits, séparés par des virgules.

De plus, l' -moption (moniteur) continuera de inotifywaitfonctionner après le premier événement, ce qui reproduira un comportement assez similaire à celui inotifywatchde.

John WH Smith
la source
1
.bashrcdans l'exemple, @ serverfaultn'apparaît pas dans les statistiques parce que l'utilisateur surveille son répertoire personnel de manière récursive mais parce qu'il path/.*est développé et en conséquence une surveillance est définie pour tous les fichiers sous path/( .bashrcinclus). La commande utilisée par l'OP ne sortira jamais les noms de fichiers car les surveillances sont définies pour /tmpet tous les sous-répertoires, donc les statistiques ne concerneront que /tmpses sous-répertoires (c'est-à-dire que vous verrez que les fichiers ont été accédés / déplacés / etc mais ils ne vous diront pas leur des noms).
don_crissti
@don_crissti Oups, j'ai mélangé les deux exemples donnés par l'OP. J'ai édité ma réponse, merci!
John WH Smith
Merci, c'était utile. Voici ma commande pour afficher le contenu de tous les tests nouvellement créés fichiers * en /tmp: inotifywait -m --format "%f" /tmp | grep --line-buffered ^test | xargs -L1 -I% sudo cat /tmp/% 2> /dev/null.
kenorb
Aussi: " Cela signifie que tout événement qui se produit sur un fichier créé après le placement des montres ne sera pas détecté. " Tout événement (même la création du fichier) SERA détecté car une montre est DÉJÀ définie pour le répertoire contenant et c'est reflété dans les statistiques de ce répertoire particulier. Voir la inotifywatchsortie dans la question OP: les 2 createévénements sont là (donc ils sont détectés) mais puisque inotifywatchregarde un répertoire (+ tous les sous-répertoires) les statistiques ne concernent que ce / ces répertoires.
don_crissti
1
Je ne pense pas que nous soyons sur la même longueur d'onde ici ... man inotify: When a directory is monitored, inotify will return events for the directory itself, and for files inside the directory.En outre, il man inotifywatchest clair quels événements sont surveillés: EVENTS>> ... Un fichier surveillé ou un fichier dans un répertoire surveillé a été accédé / fermé / ouvert / etc (signifie inclure les événements "qui se produisent sur un fichier" ). Les événements d'un fichier créé après avoir défini la surveillance sur le répertoire parent SERONT détectés et reflétés dans les inotifywatchstatistiques (il NE mentionnera PAS pour quels fichiers ces événements se sont produits).
don_crissti