fswatch
— это монитор изменения файлов, который получает уведомления при изменении содержимого указанных файлов или каталогов. fswatch
реализует несколько мониторов:
stat (2)
. fswatch
должен корректно работать в любой системе, поставляющей любой из вышеупомянутых API.
fswatch
— это интерфейс libfswatch
, библиотеки с привязкой к C и C++. Дополнительную информацию о libfswatch
можно найти здесь.
Основные возможности fswatch
:
Ограничения fswatch
во многом зависят от используемого монитора:
Монитор FSEvents , доступный только в macOS, не имеет известных ограничений и очень хорошо масштабируется в зависимости от количества наблюдаемых файлов.
Монитор уведомлений о событиях файлов , доступный в ядрах Solaris и его производных, не имеет известных ограничений.
Монитор kqueue , доступный в любой системе *BSD, поддерживающей kqueue, требует открытия файлового дескриптора для каждого просматриваемого файла. В результате этот монитор плохо масштабируется в зависимости от количества наблюдаемых файлов и может начать работать неправильно, как только в процессе fswatch
закончатся файловые дескрипторы. В этом случае fswatch
выдает одну стандартную ошибку для каждого файла, который невозможно открыть.
Монитор inotify , доступный в Linux начиная с ядра 2.6.13, может вызвать переполнение очереди, если события генерируются быстрее, чем считываются из очереди. В любом случае приложение гарантированно получит уведомление о переполнении, которое можно обработать для корректного восстановления. fswatch
в настоящее время генерирует исключение, если происходит переполнение очереди. Будущие версии будут обрабатывать переполнение, отправляя соответствующие уведомления.
Монитор Windows может устанавливать просмотр только каталогов , а не файлов. Чтобы просмотреть файл, необходимо просмотреть его родительский каталог, чтобы получать события изменения для всех дочерних элементов каталога рекурсивно на любой глубине. При необходимости события изменений можно отфильтровать, чтобы включать только изменения в нужном файле.
Монитор опроса , доступный на любой платформе, для выполнения своей задачи полагается только на доступный процессор и память. Производительность этого монитора линейно снижается в зависимости от количества просматриваемых файлов.
Рекомендации по использованию следующие:
В macOS используйте только монитор FSEvents
(поведение по умолчанию).
В Solaris и его производных используется монитор уведомлений о событиях файлов .
В Linux используйте монитор inotify
(это поведение по умолчанию).
Если количество наблюдаемых файлов достаточно мало, используйте монитор kqueue
. Имейте в виду, что в некоторых системах максимальное количество файловых дескрипторов, которые может открыть процесс, установлено на очень низкое значение (значения до 256 не являются редкостью), даже если операционная система может разрешать гораздо большее значение. В этом случае проверьте документацию вашей ОС, чтобы увеличить это ограничение либо для каждого процесса, либо для всей системы.
Если возможно, смотрите каталоги, а не файлы. Правильная настройка принимающей стороны событий для работы с каталогами может существенно снизить потребление ресурсов монитора.
В Windows используйте монитор windows
.
Если ничего из вышеперечисленного не применимо, используйте монитор опроса. Опыт авторов показывает, что fswatch
требуется около 150 МБ оперативной памяти для наблюдения за иерархией из 500 000 файлов с минимальной длиной пути 32 символа. Распространенным узким местом монитора опроса является доступ к диску, поскольку обработка stat()
большого количества файлов может занять огромное количество времени. В этом случае задержку следует установить на достаточно большое значение, чтобы уменьшить снижение производительности, которое может возникнуть в результате частого доступа к диску.
Обычный пользователь может получить fswatch
из менеджера пакетов вашей ОС или стороннего. Если вы ищете fswatch
для macOS, вы можете установить его с помощью MacPorts или Homebrew:
# MacPorts
$ port install fswatch
# Homebrew
$ brew install fswatch
Во FreeBSD fswatch
можно установить с помощью pkg:
# pkg install fswatch-mon
Проверьте свой любимый менеджер пакетов и сообщите нам, если там отсутствует fswatch
.
Пользователь, желающий собрать fswatch
должен получить архив с релизом. Архив-архив выпуска содержит все необходимое пользователю для сборки fswatch
в своей системе в соответствии с инструкциями, подробно описанными в разделе «Установка» ниже и в файле INSTALL
.
Разработчик, желающий изменить fswatch
должен получить исходные коды (либо из исходного архива, либо клонировать репозиторий) и установить на свой компьютер систему сборки GNU. Пожалуйста, прочитайте README.gnu-build-system
, чтобы получить более подробную информацию о том, как загрузить fswatch
из исходных кодов на вашем компьютере.
Получение копии репозитория исходного кода не рекомендуется, если вы не являетесь разработчиком, на вашем компьютере установлена система сборки GNU и вы не знаете, как загрузить ее с исходными кодами.
Подробную информацию о настройке и установке fswatch
смотрите в файле INSTALL
. Поскольку fswatch
собирает и использует динамические библиотеки, на некоторых платформах вам может потребоваться выполнить дополнительные задачи, прежде чем вы сможете использовать fswatch
:
Убедитесь, что каталог установки динамических библиотек ( $PREFIX/lib
) включен в пути поиска динамического компоновщика вашей операционной системы. Путь по умолчанию /usr/local/lib
будет работать практически в любой операционной системе.
Может потребоваться обновление ссылок и кеша динамических библиотек. В системах GNU/Linux вам может потребоваться запустить ldconfig
:
$ ldconfig
fswatch
— это программа C++, и для ее компиляции требуется компилятор C++, соответствующий стандарту C++11. Ознакомьтесь с документацией вашей ОС, чтобы узнать, как установить набор инструментов C++ и среду выполнения C++.
Для настройки и установки fswatch
не требуется никаких других программных пакетов или зависимостей, кроме вышеупомянутых API, используемых мониторами файловой системы.
fswatch
предоставляет следующую документацию:
Официальная документация fswatch
предоставляется в формате Texinfo. Это наиболее полный источник информации о fswatch
и единственный авторитетный. В частности, страница руководства представляет собой заглушку, которая предлагает пользователю вместо этого использовать информационную страницу.
Если вы устанавливаете fswatch
с помощью менеджера пакетов и хотите, чтобы руководство в формате PDF было включено в пакет, отправьте запрос на добавление функции сопровождающему пакета.
fswatch
является локализуемым и внутри использует GNU gettext
для отделения локализуемой строки от ее перевода. Доступные на данный момент локали:
en
).it
).es
.). Чтобы собрать fswatch
с поддержкой локализации, вам необходимо, чтобы в вашей системе был установлен gettext
. Если configure
не может найти
или компоновщик не может найти libintl
, вам может потребоваться вручную указать их расположение для configure
, обычно используя переменные CPPFLAGS
и LDFLAGS
. См. пример README.macos
.
Если gettext
недоступен в вашей системе, fswatch
выполнит сборку правильно, но у него не будет поддержки локализации, и единственной доступной локалью будет английский.
fswatch
принимает список путей, по которым должны быть получены события изменения:
$ fswatch [options] ... path-0 ... path-n
Поток событий создается, даже если какой-либо из путей еще не существует. Если они созданы после запуска fswatch
, события изменений будут приняты правильно. В зависимости от используемого наблюдателя вновь созданные пути будут отслеживаться после истечения настроенной задержки.
Вывод fswatch
можно передать в другую программу для дальнейшей обработки:
$ fswatch -0 path | while read -d "" event
do
// do something with ${event}
done
Чтобы запустить команду, когда набор событий изменений выводится на стандартный вывод, но подробности о событии не требуются, можно использовать следующую команду:
$ fswatch -o path | xargs -n1 -I{} program
Поведение соответствует более ранним версиям fswatch
(v. 0.x). Пожалуйста, прочитайте раздел «Проблемы совместимости с fswatch v. 0.x» для получения дополнительной информации.
По умолчанию fswatch
выбирает лучший монитор, доступный на текущей платформе, с точки зрения производительности и потребления ресурсов. Если пользователь желает указать другой монитор, можно использовать опцию -m
для указания монитора по имени:
$ fswatch -m kqueue_monitor path
Список доступных мониторов можно получить с помощью опции -h
.
Для получения дополнительной информации обратитесь к документации fswatch
.
Каждый может внести свой вклад в fswatch
. Пожалуйста, смотрите CONTRIBUTING
для получения дополнительной информации.
Сообщения об ошибках можно отправлять непосредственно авторам.
С автором можно связаться в IRC, используя канал Freenode #fswatch
.
Это программное обеспечение имеет двойную лицензию GPL v. 3.0 и Apache License v. 2.0.
Copyright (c) 2013–2021 Энрико М. Крисостомо
Эта программа является бесплатным программным обеспечением; вы можете распространять его и/или изменять в соответствии с условиями Стандартной общественной лицензии GNU, опубликованной Фондом свободного программного обеспечения; либо версия 3, либо (по вашему выбору) любая более поздняя версия.
Данная программа распространяется в надежде, что она будет полезна, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии ТОВАРНОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННОЙ ЦЕЛИ. Дополнительную информацию см. в Стандартной общественной лицензии GNU.
Вместе с этой программой вы должны были получить копию Стандартной общественной лицензии GNU. Если нет, см. http://www.gnu.org/licenses/.