Кросс-платформенный (Linux / OS X) наблюдатель файловой системы (команда запуска при изменении файла) - PullRequest
9 голосов
/ 15 сентября 2011

Я ищу кроссплатформенный (Linux и OS X) наблюдатель файловой системы, который не опрашивает диск на предмет изменений (или очень эффективен при этом).

Это будетОсновная часть сервера непрерывной интеграции, и обрабатывает такие вещи, как компиляция LESS / SCSS, выполнение тестов javascript и запуск пользовательских сценариев.Я хотел бы указать список файлов и каталогов, а также команды, которые будут выполняться при изменении файла или папки.

Я бы хотел что-то на основе node.js, python, сценария оболочки или на основе ruby.

Некоторые из инструментов, на которые я смотрел до сих пор ...

https://github.com/tafa/node-watch-tree

https://github.com/mikeal/watch/blob/master/main.js

doc.qt.nokia.com /latest / qfilesystemwatcher.html

buildr.apache.org / building.html # непрерывная компиляция

www.javascriptkata.com / 2010/10/28 / ready-js-prepare-your-javascript-for-production /

Любые рекомендации приветствуются.

Ответы [ 7 ]

4 голосов
/ 06 августа 2013

За исключением написанного на C, entr выглядит так, как вы хотите.

1 голос
/ 15 сентября 2011

Кросс-платформенный?Это очень сложно.Я не знаю какой-либо эффективной кроссплатформенной реализации, но, возможно, я могу предложить отправную точку.

В Linux iNotify API - функция ядра, которая контролирует файловые системы и немедленно предупреждает внимательногоприложение к соответствующим событиям.Эквивалент BSD / Mac-OS составляет kqueue .Два API кажутся очень похожими друг на друга.

Я нашел на CPAN , некоторые оболочки Perl для каждого из них.У меня нет опыта работы с Python, но я нашел Google-упаковщик этих API-интерфейсов и в фитоне.У вас есть " only ", чтобы написать свою собственную обертку вокруг них, чтобы получить вашу кроссплатформенную библиотеку.

0 голосов
/ 06 марта 2015

fswatch , кажется, лучше, особенно если вы хотите отслеживать новые файлы.

Эффективность и стабильность зависят от базового API ОС. Вот соответствующий фрагмент из README проекта:

Ограничения fswatch во многом зависят от используемого монитора:

  • Монитор FSEvents, доступный только в OS X, не имеет известных ограничений и очень хорошо масштабируется в зависимости от количества файлов. Наблюдаемый.
  • Монитору kqueue, доступному в любой * системе BSD с kqueue, требуется открывать файловый дескриптор для каждого просматриваемого файла. В результате этот монитор плохо масштабируется с количеством файлов наблюдается, и может начать плохо себя вести, как только процесс fswatch заканчивается файловыми дескрипторами. В этом случае fswatch выводит одну ошибку на стандартная ошибка для каждого файла, который не может быть открыт.
  • Монитор inotify, доступный в Linux начиная с ядра 2.6.13, может переполниться очередью, если события генерируются быстрее, чем они читать из очереди. В любом случае приложение гарантированно получить уведомление о переполнении, которое может быть обработано изящно выздороветь. fswatch в настоящий момент выдает исключение, если очередь переполнена происходит. Будущие версии будут обрабатывать переполнение, испуская надлежащие уведомления.
0 голосов
/ 04 апреля 2012

Guard поддерживает обнаружение изменений файлов в OS X через FSEvent и Linux через Inotify, согласно их списку возможностей. Мы используем его на работе для непрерывной интеграции, и он работает очень хорошо.

0 голосов
/ 04 апреля 2012

Отличный вопрос, полезный для вас, если вы хотите автоматизировать процедуры сборки и тестирования.Непрерывная интеграция - это путь.

Если вы используете git, нет ли способа установить триггер в репозитории git?Ваш триггер (работающий в вашем локальном хранилище) может выдвинуть ваши изменения и затем активировать цикл сборки / тестирования на сервере сборки.Другие системы контроля версий могут иметь аналогичные возможности, если вы не используете git.

0 голосов
/ 23 февраля 2012

достаточно ли сценария оболочки? должен быть кроссплатформенным для * nix's

for FILE in $LIST ; do #caveat if files may contain spaces, set IFS to be a \n
touch -r "$FILE" "/tmp/$FILE.timestamp" #use /dev/shm if available vs. /tmp
done
#...
while :; do
  sleep 1 #you need some sleep value to prevent eating CPU
  for FILE in $LIST ; do
    [ "$FILE" -nt "/tmp/$FILE.timestamp" ] && modified_action "$FILE"
  done
done
0 голосов
/ 15 сентября 2011

Это плагин collectd, который подключает файл для шаблона регулярных выражений.Вы можете связать пороговые значения и сценарии оповещения для запуска.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...