Creo que su enfoque es correcto, y el seguimiento de la cookie es una forma sólida de hacerlo. Sin embargo, el único lugar en el origen de inotify-tools (3.14) al que cookie
se hace referencia es en el encabezado que define la struct
API del núcleo.
Si le gusta vivir al límite, este parche ( problema # 72 ) se aplica limpiamente a 3.14 y agrega un %c
especificador de formato para la cookie de evento en hexadecimal:
--- 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 );
Este cambio modifica libinotifytools.so
, no el inotifywait
binario. Para probar antes de la instalación:
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
Asumiendo que MOVED_FROM siempre ocurre antes de MOVED_TO (lo hace, vea fsnotify_move()
, y es una cola ordenada , aunque los movimientos independientes pueden intercalarse) en su script, almacena en caché los detalles cuando ve una línea MOVED_FROM (tal vez en una matriz asociativa indexada por ID), y ejecuta tu procesamiento cuando veas un MOVED_TO con la mitad coincidente de la información.
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 tres subprocesos ejecutándose para mezclar un par de archivos cada 10,000 veces, nunca vi un solo evento fuera de orden o intercalado de eventos. Puede depender del sistema de archivos y otras condiciones, por supuesto).