2010-05-11 5 views
2

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

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

Моей проблема:
мне нужно держать время сортируется с самим последним активным «проектом» вверх верхней папкой.

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

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

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

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

ответ

1

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

Процесс (аналогично тому, как это делает бигль) довольно прост:

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

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

См. this question, в котором также упоминается this RFQ. У меня была такая же точная проблема, с которой вы столкнулись.

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

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

+0

Обновление: на самом деле это ~ 12 000 папок на NAS с памятью на 200 МБ, поэтому настройка часов на всех узлах, будь то его выполнение в первом или просто лениво, используя любой метод -r (рекурсивный) вариант командной строки на inotifywatch, похоже, что это не реально. Что мне действительно нужно, это некоторые подсказки о том, как атаковать другой путь, используя или помещая некоторые крючки в smbd. –

+0

@Simon B. По умолчанию количество максимальных часов для каждого пользователя составляет 8192, поэтому 12 или даже 15 тысяч часов - это вовсе не необычно. Имейте в виду, что часы (и их пути) хранятся в пространстве _kernel_. На самом деле проблема заключается не в том, что память доступна в пользовательском пространстве, а в производительности, достигнутой в VFS на NAS-сервере. Если смотреть только каталоги, это не должно быть слишком плохо. Кстати, я правильно прочитал, 200 МБ бара на NAS? –

+0

Да. Мы используем «Netgear ReadyNAS Duo», и при совершении покупок мы действительно не ожидали, что будем хранить всю структуру папок в памяти ... кроме того, при обычном использовании реальным узким местом на Duo является мощность процессора. –

1

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

Samba Howto : Stackable VFS Modules

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

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

+0

Спасибо. Оказывается, мне нужен плагин или модуль Samba VFS (.sa-файл), который обычно входит в/usr/local/samba/lib/vfs и, предположительно, автоматически загружается при перезагрузке smbd. * О VFS: http://vfsx.sourceforge.net/ * При установке модулей VFS; http://openantivirus.cvs.sourceforge.net/viewvc/openantivirus/samba-vscan/INSTALL?revision=1.31&view=markup * Исходный код для (6-7 лет) samba Плагин VFS: http://file-ext-map.cvs.sourceforge.net/file-ext-map/ * Теперь я ищу исходный код vscan-clamav, но не удается найти исходный код, видимый онлайн. –

+0

Удачи! Мне нравится читать сообщение в блоге об этом, когда вы его снимаете. –