Penso che il tuo approccio sia corretto e che il monitoraggio dei cookie sia un modo efficace per farlo. Tuttavia, l'unico posto nella fonte di inotify-tools (3.14) a cui si cookie
fa riferimento è nell'intestazione che definisce la struct
corrispondenza con l'API del kernel.
Se ti piace vivere al limite, questa patch ( numero 72 ) si applica in modo pulito a 3.14 e aggiunge un identificatore di %c
formato per il cookie dell'evento in esadecimale:
--- 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 );
Questa modifica modifica libinotifytools.so
, non il inotifywait
binario. Per testare prima dell'installazione:
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
Supponendo che MOVED_FROM si verifichi sempre prima di MOVED_TO (lo fa, vedi fsnotify_move()
, ed è una coda ordinata , anche se mosse indipendenti potrebbero essere intercalate) nello script, memorizzi nella cache i dettagli quando vedi una riga MOVED_FROM (forse in un array associativo indicizzato da ID), ed esegui l'elaborazione quando vedi un MOVED_TO con la metà corrispondente delle informazioni.
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
(Con tre thread in esecuzione per mescolare una coppia di file ogni 10.000 volte, non ho mai visto un singolo evento fuori servizio o interleaving di eventi. Potrebbe dipendere dal filesystem e da altre condizioni ovviamente.)