Ich denke, Ihr Ansatz ist korrekt, und das Verfolgen des Cookies ist ein robuster Weg, dies zu tun. Die einzige Stelle in der Quelle von inotify-tools (3.14), auf cookie
die verwiesen wird , ist jedoch der Header, der struct
die Übereinstimmung mit der Kernel-API definiert.
Wenn Sie gerne am Rande leben, gilt dieser Patch ( Problem Nr. 72 ) sauber für 3.14 und fügt einen %c
Formatbezeichner für das Ereignis-Cookie in hex:
--- 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 );
Diese Änderung ändert sich libinotifytools.so
, nicht die inotifywait
Binärdatei. So testen Sie vor der 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
Angenommen, MOVED_FROM tritt immer vor MOVED_TO auf (es fsnotify_move()
ist eine geordnete Warteschlange , obwohl unabhängige Verschiebungen möglicherweise verschachtelt sind). In Ihrem Skript werden die Details zwischengespeichert, wenn eine MOVED_FROM-Zeile angezeigt wird (möglicherweise in einem durch ID indizierten assoziativen Array). und führen Sie Ihre Verarbeitung aus, wenn Sie ein MOVED_TO mit der passenden Hälfte der Informationen sehen.
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
(Da drei Threads ausgeführt werden, um jeweils 10.000 Mal ein Dateipaar zu mischen, habe ich nie ein einzelnes Ereignis außerhalb der Reihenfolge oder eine Verschachtelung von Ereignissen gesehen. Dies kann natürlich vom Dateisystem und anderen Bedingungen abhängen.)