Je pense que votre approche est correcte, et le suivi du cookie est un moyen robuste de le faire. Cependant, le seul endroit dans la source d'inotify-tools (3.14) qui cookie
est référencé est dans l'en-tête définissant le struct
pour correspondre à l'API du noyau.
Si vous aimez vivre sur le bord, ce correctif ( problème # 72 ) s'applique proprement à 3.14 et ajoute un %c
spécificateur de format pour le cookie d'événement en hexadécimal:
--- libinotifytools/src/inotifytools.c.orig 2014-10-23 18:05:24.000000000 +0100
+++ libinotifytools/src/inotifytools.c 2014-10-23 18:15:47.000000000 +0100
@@ -1881,6 +1881,12 @@
continue;
}
+ if ( ch1 == 'c' ) {
+ ind += snprintf( &out[ind], size-ind, "%x", event->cookie);
+ ++i;
+ continue;
+ }
+
if ( ch1 == 'e' ) {
eventstr = inotifytools_event_to_str( event->mask );
strncpy( &out[ind], eventstr, size - ind );
Ce changement modifie libinotifytools.so
, pas le inotifywait
binaire. Pour tester avant l'installation:
LD_PRELOAD=./libinotifytools/src/.libs/libinotifytools.so.0.4.1 \
inotifywait --format="%c %e %f" -m -e move /tmp/test
Setting up watches.
Watches established.
40ff8 MOVED_FROM b
40ff8 MOVED_TO a
En supposant que MOVED_FROM se produit toujours avant MOVED_TO (c'est le cas, voyez fsnotify_move()
, et c'est une file d'attente ordonnée , bien que des mouvements indépendants puissent être entrelacés) dans votre script, vous mettez en cache les détails lorsque vous voyez une ligne MOVED_FROM (peut-être dans un tableau associatif indexé par ID), et exécutez votre traitement lorsque vous voyez un MOVED_TO avec la moitié correspondante des informations.
declare -A cache
inotifywait --format="%c %e %f" -m -e move /tmp/test |
while read id event file; do
if [ "$event" = "MOVED_FROM" ]; then
cache[$id]=$file
fi
if [ "$event" = "MOVED_TO" ]; then
if [ "${cache[$id]}" ]; then
echo "processing ..."
unset cache[$id]
else
echo "mismatch for $id"
fi
fi
done
(Avec trois threads en cours d'exécution pour mélanger une paire de fichiers chaque 10 000 fois, je n'ai jamais vu un seul événement hors service ou un entrelacement d'événements. Cela peut dépendre du système de fichiers et d'autres conditions bien sûr.)