Я думаю, что ваш подход правильный, и отслеживание cookie - надежный способ сделать это. Однако единственное место в источнике inotify-tools (3.14), на cookie
которое ссылаются, находится в заголовке, определяющем, struct
чтобы соответствовать API ядра.
Если вам нравится жить на грани, этот патч ( выпуск № 72 ) чисто применяется к 3.14 и добавляет %c
спецификатор формата для файла cookie события в шестнадцатеричном формате:
--- 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 );
Это изменение изменяет libinotifytools.so
, а не inotifywait
двоичный файл. Чтобы проверить перед установкой:
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
Предполагая, что MOVED_FROM всегда происходит перед MOVED_TO (это происходит, видите fsnotify_move()
, и это упорядоченная очередь , хотя независимые перемещения могут чередоваться) в вашем скрипте вы кэшируете детали, когда видите строку MOVED_FROM (возможно, в ассоциативном массиве, индексированном по ID), и запустите обработку, когда увидите MOVED_TO с соответствующей половиной информации.
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
(С тремя потоками, работающими для перетасовки пары файлов каждые 10000 раз, я никогда не видел ни одного неупорядоченного события или чередования событий. Конечно, это может зависеть от файловой системы и других условий.)