Как стать автором
Обновить

Комментарии 34

Ну, если Вы уже в тэгах упомянули inotify, то надо было посвятить нас — чем он Вас не устроил? Особенно в свете существования incron'а.
Мне также нужна поддержка FreeBSD, я написал об этом.
Ну так механизм inotify там в полной красе. А вот incron'а увы нету…
Насколько мне известно, на фре вместо inotify используется kqueue.
kqueue это конечно да, Но мне казалось, что inotify из Linux там тоже присутствует.
нет конечно. зачем? inotify это нашлёпка в ядро Linux. kqueue это базовая функциональность FreeBSD. зачем ему нашлёпка inotify?
Да вот, сейчас искал так и не нашёл. Странно, откуда у меня это ощущение, что видел я во фре inotify :-( Постараемся больше смуту не вносить.
нене, я смотрел специально. просто не нужно. тем более, inotify догнал kqueue совсем недавно. а так там были некоторые проблемы.
У Inotify:
Гораздо выше лимит на кол-во отслеживаемых файлов
Нет проблем с отмонтированием ФС на которых отслеживаются файлы (если поставить следилку на файл а потом попытаться отмонтировать этот раздел, то ничего не выйдет)
нет там лимита. там немного удобнее тем, что в каталоге inotify будет давать нотификацию по всем файлам, не беря отдельно. зато там долгие годы были иные проблемы.
с монтированием да — придётся ловить отдельно
Нет лимита? 1024 же по умолчанию лимит на кол-во файловых дескрипторов. Да, можно увеличить, но не всегда.
Где такой лимит?
packages.python.org/watchdog/installation.html#dependencies

BSD variants come with kqueue which programs can use to monitor changes to open file descriptors. Because of the way kqueue(2) works, watchdog needs to open these files and directories in read-only non-blocking mode and keep books about them.

watchdog will automatically open file descriptors for all new files/directories created and close those for which are deleted.

The maximum number of open file descriptor per process limit on your operating system can hinder watchdog‘s ability to monitor files.
Где 1024? :)
freebsd:
open files (-n) 294912

ubuntu:
open files (-n) 1024

Ну так мы про FreeBSD? :)
Хм, ну если на FreeBSD так по умолчанию и без ущерба производительности то ок. MacOS под рукой нет, как там с этим не могу сейчас сказать.
Но да, я именно про ulimit -n говорил
В БСД упрется в
kern.maxfiles: 12328
kern.maxfilesperproc: 11095

К счастью без зазрения совести можно сделать так.
Главное помнить об оверхеде.

kern.maxfiles: 25000000
kern.maxfilesperproc: 22500000

Еще момент вспомнил про KQueue чисто субъективный — довольно сложно было найти хорошую документацию/примеры/хауту по слежению за файлами через KQueue.
Просто где ни читаешь — на Windows RDCW, примеры, описания, на Linux Inotify + примеры, описания. А про FreeBSD в лучшем случае напишут «аналогом Inotify на FreeBSD является KQueue» и ни примера ни подробностей. Т.е. о такой функциональности в принципе слышали, но никто ее не видел. Когда разберешься, то уже все просто, но в начале даже непонятно: «работает ли это на практике или просто для галочки, а если и работает то почему так трудно найти примеры, наверное криво работает рас никто не пользуется». Да и если гуглить KQueue то в основном про слежение за сокетами пишут.
НЛО прилетело и опубликовало эту надпись здесь
Мне нужно было кроссплатформенное решение мониторинга в самом python, т.к. результаты в нем же потом и обрабатываются.
Имел опыт написания асинхронной следилки под MacOS, Windows и Linux на Python (Twisted)…
Задача была отслеживать рекурсивно каталог и все изменения в нем. При этом, по возможности, обойтись без отдельного треда (т.е. следить в EventLoop Twisted-а).
По легкости написания:
Windows самый простой O_o (ReadDirectoryChangesW + WaitForMultipleEvents) Опционально асинхронное, поддерживает все события, рекурсию, переименования. Для слежения навешивается обработчик на отслеживаемый корневой каталог.
Linux посерединке (Inotify) Опционально асинхронное, поддерживает все события, но не поддерживает рекурсию и переименование (только через механизм «Cookies»). Для слежения навешивается обработчик на отслеживаемый корневой каталог и все его дочерние каталоги.
MacOS самый геморройный (Kqueue) — Асинхронное, поддерживает все события (вроде), не поддерживает рекурсию, переименования (засчитывается как удаление и создание). Для слежения навешивается обработчик на отслеживаемый корневой каталог и все его дочерние каталоги и НА ВСЕ ФАЙЛЫ, если файлов больше 1024 нужно лезть в ulimit. Ну и желательно иметь в памяти слепок структуры каталогов, чтобы отслеживать переименования. На FreeBSD все точно так же, но есть проблема с отмонтированием ФС на которых следят. На MacOS есть еще механизм FSEvents, но у него не нашел асинхронного варианта.
или WaitForMultipleObjects, не помню.
FSEventStream на Mac OS X отлично поддерживает асинхронные нотификации (FSEventStreamScheduleWithRunLoop). Допускаю, что с пайтоном это дружит плохо.
Гуглится масса python-скриптов где используется FSEventStreamScheduleWithRunLoop.
Так что видимо вполне себе дружит :)
можно еще использовать rsync для мониторинга изменений удаленно, прикрутить к крону или подобному скрипту, вызывать из java и тому прочее… вот, в целом отличная статья, небольшая и полезная!
Целевым обработчиком событий в ФС является все тот же python, который предпринимает некоторые действия. Чем меньше внешних вызовов, тем лучше.

А rsync показывает не самую высокую производительность на большом числе файлов и нагруженных дисках… Как раз те условия, где будет использоваться система с python.
А чем aide не устроила?
Результаты мониторинга обрабатываются там же, внутри python. Цель не проверять целостность и неизменность ФС, а оперативно учитывать изменения ФС в основной логике программы.
Модуль из статьи и AIDE частично пересекаются в реализации, но предназначены для разных вещей.
Во FreeBSD есть mtree.
и как оно помогает в реальном времени отслеживать изменения файлов?
Можно в крон запихнуть.
Но, как и в варианте ТС, лишние IOPS могут тормозить сервер.
откуда там лишние IOPS'ы? там нотификации из ядра о событиях. сам inotify ничего с диска не читает.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории