Обнаружение посторонних переименований IN_MOVED_FROM с помощью inotify

Предположим, что программа на C отражает изменения в отслеживаемом каталоге в зеркальном каталоге. Вы рекурсивно просматриваете все подкаталоги и используете структуру, проиндексированную на watch descriptors, содержащую pathnames отслеживаемых каталогов, чтобы иметь возможность восстановить полное имя файла в случае события. Это все, что вам нужно для обработки всех событий, кроме IN_MOVED_FROM и IN_MOVED_TO. В случае с этими двумя вам, в дополнение к вышеупомянутому, кажется, также потребуется следующее:

  • Структура с индексом cookies, позволяющая сохранять и извлекать watch descriptor и filename определенного события IN_MOVED_FROM после появления соответствующего события IN_MOVED_TO.
  • timestamp-упорядоченная очередь (избыточная), содержащая файлы cookie, которые еще не были объединены в пару, чтобы их можно было интерпретировать как IN_DELETE события и удалить из обеих структур по истечении произвольного периода времени.
  • Отношение pathname/filename -> watch descriptor (избыточное), которое позволяет вам эффективно определять watch descriptor тайм-аута cookie в случае, если (повторно) перемещенный объект файловой системы был каталогом, который вам теперь нужно отменить.

Довольно много накладных расходов на поддержку операций переименования. Действительно ли нет другого способа обнаружить иностранное переименование, кроме ожидания истечения времени ожидания непарного файла cookie? Учитывая тот факт, что существует похоже, это способ различить локальное и иностранное переименование в fsnotify это кажется довольно странным. выбор.


person Witiko    schedule 30.11.2013    source источник
comment
Я бы рассмотрел команду mirrordir. Либо используйте его напрямую, либо просмотрите источник. linux.die.net/man/1/mirrordir и mirrordir.sourcearchive.com/documentation/0.10.49-intl/   -  person jim mcnamara    schedule 30.11.2013
comment
Команда не использует inotify для обнаружения событий файловой системы. На самом деле, кажется, что он вообще не обнаруживает события файловой системы — он просто отражает каталог и завершает работу вместо того, чтобы отслеживать его изменения.   -  person Witiko    schedule 30.11.2013
comment
ИМО - это потому, что настоящее зеркало работает на уровне драйвера в ядре. rsync также отражает изменения в локальных/нелокальных каталогах. Тоже запускается и выходит. Итак, кроме как для обучения, я не вижу попыток разработать пользовательское зеркало.   -  person jim mcnamara    schedule 30.11.2013
comment
Это, действительно, для учебных целей. Кроме того, помимо переименований, библиотека inotify кажется мне жизнеспособным решением для пользователя.   -  person Witiko    schedule 01.12.2013


Ответы (2)


С inotify вам нужно установить тайм-аут для обработки операции несовпадающего/непарного/чужого переименования (например, mv файла в отслеживаемый каталог или из него), обрабатывать их как события IN_CREATE или IN_DELETE.
Однажды я работал над проект, связанный с механизмом синхронизации файлов, столкнулся с той же проблемой и решил ее таким же образом.

ИМХО, дизайн inotify API несколько отвратителен. Возьмите в качестве примера операцию переименования, inotify интерпретирует ее как ДВА отдельных события. :-(

Согласно ссылке, которую вы даете, ядро ​​Linux различает локальные и внешние переименовать, и вы можете добиться этого с помощью интерфейса dnotify. Но так как интерфейс dnotify уже устарел из-за интерфейса inotify, я не буду этого рекомендовать.

ссылка:
http://en.wikipedia.org/wiki/Dnotify

person zeekvfu    schedule 03.12.2013
comment
Мало того, что он устарел, я даже не смог найти никакой документации по dnotify, когда искал его. - person Witiko; 03.12.2013
comment
@Witiko Взгляните на это: mjmwired.net/kernel/Documentation/filesystems/ dnotify.txt - person zeekvfu; 03.12.2013
comment
Прекрасный. Видимо, я не копал достаточно глубоко. - person Witiko; 03.12.2013

Я предлагаю либо изучить, либо просто дать ссылку на библиотеку libinotifytools. Он обрабатывает большинство, если не все случаи.

person ismail    schedule 02.12.2013
comment
Как только у меня появится свобода выбора библиотеки, я обязательно это сделаю. На данный момент я полагаю, что проверка источника библиотеки является наиболее разумным направлением действий. - person Witiko; 03.12.2013