Инженеры из компании Facebook анонсировали (https://www.facebook.com/notes/facebook-engineering/watchman...) новый открытый инструмент Watchman (https://github.com/facebook/watchman), в рамках которого создан сервис для отслеживания изменения и поиска файлов в заданных иерархиях директорий. При обнаружении факта изменения содержимого файла Watchman позволяет выполнить определённое пользователем событие, привязанное к типу файла и характеру изменений.
Несмотря на то, что подобные возможности могут найти достаточно широкую область применения, основной целью разработки является ускорение работы системы сборки больших проектов, в которых Watchman может быть использован для автоматизации пересборки ресурсов, связанных с файлом для которого зафиксировано изменение. В частности, Watchman используется в Facebook для ускорения многоступенчатой системы сборки компонентов на языке PHP - вместо пересборки всего проекта применяется тактика инкрементальной пересборки только изменённого кода.
Код проекта написан на языке Си и распространяется (https://github.com/facebook/watchman) под лицензией Apache 2.0. Программой поддерживается широкий спектр средств отслеживания изменений в файловой системе: inotify в Linux, kqueue в Mac OS X, FreeBSD 9.1 и OpenBSD, port_create в Illumos и Solaris.Watchman поддерживает рекурсивный мониторинг изменений в произвольном числе директорий, отслеживая всю иерархию от текущей директории до конечных ветвей дерева. Перед инициированием действия и запуском связанной с ним команды система дожидается завершения изменения и закрытия файла. Серверный и клиентский интерфейс реализован в рамках единого исполняемого файла watchman, поддерживающего как управление из командной строки так и работу в виде сервиса, обрабатывающего запросы в формате JSON.
Допускается создание достаточно сложных фильтров, определяющих правила выбора файлов для привязки к действиям. Возможно определение исключений, учёт времени изменения, использование регулярных выражений PCRE и логических операторов, задание таймаута перед запуском команды, создание многоступенчатых правил (например, запуск действия когда файл А изменён после изменения файла Б). Watchman также поддерживает большинство возможностей утилиты find, но отличается тем, что осуществляет выборку по предварительно сформированному индексу, без перебора содержимого всей иерархии директорий на каждый запрос. Также поддерживается работа в режиме накопления лога изменений содержимого файловой системы. Кроме запуска приложений для выполнения действий поддерживается организация взаимодействия через систему подписки на изменения, при котором внешняя программа открывает сокет и ждёт поступления сигналов о наличии изменений.
Простейший пример использования сервиса выглядит следующим образом:
Запускаем мониторинг директории ~/src:<font color="#461b7e">
$ watchman watch ~/src
</font>
Указываем о необходимости запуска программы buildme при изменении CSS-файлов (путь к файлу передаётся в качестве аргумента при запуске buildme):<font color="#461b7e">
$ watchman -- trigger ~/src buildme '*.css' -- minify-css
</font>URL: https://www.facebook.com/notes/facebook-engineering/watchman...
Новость: http://www.opennet.dev/opennews/art.shtml?num=37101
Чем он лучше связки крон + %система версионирования%?
Тем, что не костыль на баше, а специально заточенная под задачу софтина.
> Тем, что не костыль на башеНе костыль - значит, не юниксвейно. Можно закaпывать.
> Не костыль - значит, не юниксвейно. Можно закaпывать.Ждем когда вы перепишете на баше кернел. Чтобы стало совсем уж юниксвэйно.
Мы работаем над этим. Столкнулись с проблемой: наше ядро нуждается в интерпретаторе. Совать для этого сишный блоб баша - поттерингизм в терминальной стадии. Должно быть все на чистых скриптах, включая прошивку биоса. Но вот кто их будет интерпретировать - пока непонятно.
> кто их будет интерпретировать - пока непонятно.Барон Мюнхаузен, разумеется. Он специалист по решению таких задач :). В честь его умения вытаскивать самого себя за шнурки ботинок из болота это прямо так и называется - bootstrap.
глубокоуважаемый барон вытаскивал себя за волосы, но суть та же.
> глубокоуважаемый барон вытаскивал себя за волосы, но суть та же.Кэп, кстати, намекает, что процессор - это такой аппаратный интерпретатор машинных команд. Вот так вот просто. Так что кексам надо всего ничего - сделать свой проц который будет баш на уровне аппаратных автоматов обмолачивать. И задача станет решаемой :)
> Кэп, кстати, намекает, что процессор - это такой аппаратный интерпретатор машинных команд.
> Вот так вот просто. Так что кексам надо всего ничего -
> сделать свой проц который будет баш на уровне аппаратных автоматов обмолачивать.
> И задача станет решаемой :)А не будет ли использование аппаратного CPU нарушением принципов UNIX? Ведь кристалл - это не скрипт, туда нельзя напихать отладочных вызовов, или поменять что-то без пересборки. Т.е. почти как блоб.
> Ведь кристалл - это не скрипт,С учетом того что исходники современных чипов как правило пишут на языках формального описания (VHDL, etc) - оно конечно, не скрипт. Но уж точно вид программы.
Можно ли менять на ходу? Хм, вообще, технологии придуманы. Вон в х86 процах например можно перегружать кусок микрокода, до некоторой степени меняя логику работы CPU. Что позволяет фиксить баги даже после того как проц уже выпущен с фабрики. А в FPGA и вовсе - какой bitstream зальешь, тем оно и станет. Значит надо что-то типа FPGA программируемого на bash, для достижения полного делириума поклонниками культа :)
Bootstrap - это не шнурок, а такая небольшая лямка на пятке ботинка, чтобы за нее можно было тянуть при надевании ботинка на ногу.
Сам термин "bootstrapping" произошел от американской поговорки, но многие считают, что именно от истории про барона Мюнхгаузена из-за схожести принципа.
От чего же не юниксвейно-то? нафиг цсс, мониторить каталог расшаренный по tftp для цисок и прочего сетевого хлама, а то ловить событие в rsyslog который в центосе жутко древний от демона который через сутки работы забивает на запись отладочных мессаг в лог и который приходится перегружать по крону из-за этого, вот это костылище.Странно, что ничего подобного нет - создаем /cfg, монтируем туда tmpfs, вешаем эту прогу и кучу скриптов или бинарей, которые, например при записи 10.0.0.1/24 в /cfg/net/eth0/ipv4/addr добавляют алиас на интерфейс или в зависимости от записи/перезаписи вешают ip, делая ip addr flush dev eth0 перед этим. - прозразно, просто, униксвейно, нафиг уродцев типа системд, хотим запустить свой исполняемый файл перед/после сбросом/установкой ip делаем echo my_script > /cfg/net/ipv4/eth0/addr_(after|before)_change, что может быть удобнее и проще.
> что может быть удобнее и проще.Нормальные системы управления конфигурацией, типа puppet. Гораздо удобнее и проще ваших костылей. И давно реализованы.
> Нормальные системы управления конфигурацией, типа puppet. Гораздо удобнее и проще ваших
> костылей. И давно реализованы.Puppet (англ. марионетка) — кроссплатформенное клиент-серверное приложение, которое позволяет централизованно управлять конфигурацией операционных систем и программ, установленных на нескольких компьютерах. Puppet написан на языке программирования Ruby.
Да идите вы с вашим руби куда-нибудь, реализуйте его поддержку для всех встраиваевых платформ, задолбали со своими перлами и питонами, есть система, а есть узерспейс тулс, и нехрен пихать второе в первое.
> Да идите вы с вашим руби куда-нибудь, реализуйте его поддержку для всех
> встраиваевых платформ, задолбали со своими перлами и питонами, есть система, а
> есть узерспейс тулс, и нехрен пихать второе в первое.Точно! Система управления конфигурацией должна быть реализована непосредственно в ядре, безо всякого юзерспейса! Дадим достойный ответ поттеринговской блоатвари!
>> что может быть удобнее и проще.
> Нормальные системы управления конфигурацией, типа puppet.Ололо, указанная штукенция - это монитор изменения файлов. Казалось бы, при чем здесь puppet, который средство группового администрирования прежде всего?
При том, что некий адепт культа костыля предлагает на базе монитора изменения файлов сделать велосипед для группового администрирования (см. выше).
Какого черта, причем тут групповое администрирование, я предложил вариант при котором не надо еб..ть мозг зайдя под юзером на линукс и набрав ifconfig увидеть - комманд нот фаунд, потому что, мля, кто-то решил, что нефиг делать каталогам sbin в переменной PATH обычных узеров.Кстате если уж, то расшаривайте /cfg через sftp и меняйте параметры системы по сети, и не надо ставить никаких дополнительных пакетов, не хотите фтп, юзайте smb или что душа пожелает.
Вот это униксвейно. а ваш пупет вместе с питоном засуньте себе поглубже.
А реагировать на изменения в каталоге /cfg кто будет? Ядро?
> Тем, что не костыль на баше, а специально заточенная под задачу софтина.bash и не-bash - это все лишь инструменты. И на bash и на C можно написать как полное убожество, так и нормальную вещь.
Повторю вопрос: чем лучше других (inotify, например) с точки зрения результата?
> Повторю вопрос: чем лучше других (inotify, например) с точки зрения результата?inotify - это технология. watchman - это решение, использующее данную технологии. Полноценное и универсальное, в отличие от PoC типа inotifywatch.
> Чем он лучше связки крон + %система версионирования%?Тем что пользует средства современных операционок вместо тупого и ресурсожоркого поллинга по крону. Не, если ресурсы девать некуда, ждать между запусками скрипта не в облом, а тупняки при обходе иерархии не напрягают - можно и по крону. А можно вот и лучше сделать, что актуально когда задача не "одноразовая".
О боги, я представляю с помощью каких костылей работает fb если им нужны такие тулзы!
> О боги, я представляю с помощью каких костылей работает fb если
> им нужны такие тулзы!Вся вебня так работает. Тоже мне, открытие века....
Думал в нашем проекте написать что-то подобное, а тут уже готовое решение. Попробуем, если будет как заявлено, включим в нашу систему.
http://www.opennet.dev/openforum/vsluhforumID3/90323.html#17
Либо пере изобрели либо еще сильно курили (там первый коммит от 2010 года)https://github.com/greggoryhz/Watcher
Пользую уже 2 года.
все уже давно написаноwhile inotifywait -e modify ~/src; do
buildme '*.css' -- minify-css
done
У вас слишком простые исходники. man inotifywait, /-r
dtrace такое тоже умеет
> dtrace такое тоже умеетСистема отладки - для мониторинга проекта и пересборки? Спору нет, холодильником тоже можно гвозди забивать при сильном желании. Просто очень неудобно.
>вместо пересборки всего проекта применяется тактика инкрементальной пересборки только изменённого кода.мне кажется, или все нормальные компиляторы нормальных языков программирования и так так поступали уже десятки лет назад? Компиляторы Паскаля например..
Если компилатор какой-то подобной глупостью занимается - в топку его. Мало ли в каких условиях его запускали и почему надо перебилдить. Это дело внешней тулзы. Но я как-то не припомню таких идиотских компиляторов. А паскалевские (особенно для какого-нибудь простенького BP7) просто очень шустры, там время компиляции не всегда и заметно.
Возможно, под "компилятор" он имел в виду что-нибудь типа "эклипс"
make
да пожалуй я имел ввиду билдер, а не компилер - взять к примеру Delphi, там просто это все было интегрировано. Помню что он создавал dcu-файлы - скомпилированные модули, и при следующей компиляции пересобирал только измененные pas-модули. Это было более двадцати лет назад
> да пожалуй я имел ввиду билдер, а не компилер - взять к
> примеру Delphi, там просто это все было интегрировано. Помню что он
> создавал dcu-файлы - скомпилированные модули, и при следующей компиляции пересобирал только
> измененные pas-модули. Это было более двадцати лет назадПоследние 20 (а то и больше) лет утилита make работает именно так. И ее можно использовать при сборке не только из пасквиля, но и практически любого компилируемого языка.
ну make вообще ущербный инструмент и на самом деле не умеет того что умеет любой билдер для паскаля так что сравнение не уместно. В С/С++ для которых в основном используется make для сборки вообще нет понятия модуля, а то что есть - костыли препроцессора лишь имитирующие модульность.
Теперь изменения ваших файлов в вашей хронике на ФБ :)
фейсбук написал свой велосипед, хотя уже давным-давно есть известный lsyncdну хотя это их стайл. скоро свой язык напишут)
> фейсбук написал свой велосипед, хотя уже давным-давно есть известный lsyncdА чего не dropbox сразу? Или ubuntuone?
а что нет?
> а что нет?А еще можно резиновым х*ем гвозди заколачивать.
Программа сливает всё в FBI^W Facebook?
А Linux сливает все твои данные на kernel.org, ага.
Не совсем понятно как его запустить как службу и общаться с помощью json
Странно вспомнили про inotify, но не упомянули incron, а это прямой аналог.
как это инжИнеры фб не запилили код на руби,
видимо там еще кто то остался кто знает С
лол
Пля, баян великий...1. В лине уже стотыщь мильонов лет есть inotify/dnotify/fanotify и куча софта для управления ими.
2. Из IRIX 6.0 (1994 год) мигрировал fam (File Alteration Monitor), бинарь http://oss.sgi.com/projects/fam/,
и перловый фреймворк к нему http://search.cpan.org/~jglick/SGI-FAM-1.002/lib/SGI/FAM.pm
> Пля, баян великий...
> 1. В лине уже стотыщь мильонов лет есть inotify/dnotify/fanotify и куча софта
> для управления ими.
> 2. Из IRIX 6.0 (1994 год) мигрировал fam (File Alteration Monitor), бинарь
> http://oss.sgi.com/projects/fam/,
> и перловый фреймворк к нему http://search.cpan.org/~jglick/SGI-FAM-1.002/lib/SGI/FAM.pmВесь СПО такой же. Слышал звон - не знаю, где он - а, напишу новый велик!
>kqueue в Mac OS X, FreeBSD 9.1не знаю, когда оно там появилось в мокос, но во фре оно с 4.1 есть, интересно, чего это про 9.1 написано:\
еще одни пыходети не осилили http://pythonhosted.org/watchdog/
От вы тупни старообрядные, пишу из будущего и уверяю, что данная утилита нашла широкое применение в прикладном программировании, без неё совершенно не обойтись!!!