Может ли какой-нибудь linux API или инструмент следить за изменениями в любой папке ниже, например /SharedRoot, или мне нужно настроить, например, inotify для каждой папки?

У меня есть папка с ~10 000 подпапок.

Может ли какой-нибудь linux API или инструмент следить за изменениями в любой папке ниже, например /SharedRoot, или мне нужно настроить inotify для каждой папки? (т.е. я проигрываю, если хочу сделать это для 10k+ папок). Думаю, да, поскольку я уже видел примеры этого неэффективного метода, например, http://twistedmatrix.com/trac/browser/trunk/twisted/internet/inotify.py?rev=28866

Моя проблема:
Мне нужно, чтобы папки были отсортированы по времени с последним активным "проектом".

Когда файл изменяется, каждая папка над этим файлом должна обновлять свою последнюю измененную метку времени, чтобы соответствовать файлу. Задержки в порядке. Открыв файл (обычно MS Excel) и закрыв его снова, дата его файла может прыгать вверх, а затем снова вниз. По этой причине мне нужно подождать до тех пор, пока файл не будет закрыт, затем поставить в очередь папку этого файла для проверки, и только спустя некоторое время я пойду и найду самый новый файл в его папке, поскольку дата файла запускающего файла может уже быть задним числом к ​​своей первоначальной отметке времени в Excel или аналогичных программах. Также в случае использования / создания нескольких файлов из одной и той же папки имеет смысл буферизовать временные метки родителей этих папок, чтобы хотя бы свести кучу обновлений в одно отложенное обновление.

Я ищу решение Linux. У меня есть код, который можно запустить на сервере Windows, большинство функций очереди здесь: http://github.com/sesam/FolderdateFollowsFiles/blob/master/FolderdateFollowsFiles/Follower.vb

Доступные API:s
Родственник inotify в Windows, ReadDirectoryChangesW, может просматривать папку и все ее поддерево; см. bWatchSubtree на http://msdn.microsoft.com/en-us/library/aa365465(VS.85).aspx

Samba?
Исправление источника самбы возможно, но, возможно, уже есть доступные хуки? Другие возможности, такие как на стороне клиента (различные версии Windows) и шпионить за действиями с файлами для рекурсивного обновления папок?

2 ответа

Я видел, что вы управляете этими деревьями под общим ресурсом Samba. Возможно, вы можете использовать модуль VFS для сканирования на вирусы ClamAV, чтобы узнать, как они запускают "сканирование при закрытии".

Samba Howto: наращиваемые модули VFS

Должно быть довольно просто проверить время закрытого файла и изменить путь к каталогу, ведущему к нему, без каких-либо издержек производительности / памяти, связанных с inotify et al.

Просто мысль.

Да, вам нужно использовать inotify, однако вам не нужно сразу использовать часы на каждом узле.

Процесс (похожий на то, как это делает beagle) довольно прост:

  1. Установите часы на корневой узел.
  2. Выполните поиск в ширину (а не в глубину), начиная с корневого узла
  3. Установите часы по каталогам, в порядке поиска.
  4. Следите за событиями создания каталогов, продолжайте добавлять, как они делают. Пересортируйте свой список, как это происходит.

Поиск в ширину важен, иначе вы можете пропустить некоторые вещи из-за гонки, когда вы запускаете и что делают клиенты корневого узла.

Смотрите этот вопрос, который также упоминает этот запрос предложений. У меня была та же самая проблема, с которой вы сталкиваетесь.

По сути, один поток продолжает отслеживать события создания каталогов, добавляя новые наблюдения в новые каталоги практически одновременно с их созданием. Что-то еще сортирует список либо по запросу, либо после того, как поток inotify снимает свою блокировку.

Я пытался использовать версии без блокировки, но с.. сомнительным.. успехом:)

Другие вопросы по тегам