Показаны сообщения с ярлыком dnotify. Показать все сообщения
Показаны сообщения с ярлыком dnotify. Показать все сообщения

среда, 9 февраля 2011 г.

Мониторинг директорий в linux с использованием inotify

Совсем недавно я экспериментировал с dnotify - http://kilork.blogspot.com/2011/01/linux-dnotify.html. Штука уже вполне успешно работает, не требует кушать, но все же что-то не дает покоя. Ах вот оно что, интерфейс то устаревший, нормальные люди так не работают. Приходится признать, в своих познаниях по ядерным интерфейсам я отстаю лет на 10. Ну, надо как-то наверстывать.

Итак, inotify. Логичное развитие dnotify. Проще, лучше, надежнее. Вечер перед монитором, и готова новая версия утилиты для мониторинга:


Компилируется также просто, как и в прошлый раз:
gcc inotify.c -o inotify

Ну и поведение программки не отличается:
./inotify "echo hello" .
по прежнему запускает слушание текущей директории с выводом 'hello' при любом телодвижении в этой директории. Зато есть масса плюсов, да и просто, код значительно легче читается.

Исходные коды доступны в hg-репозитории по адресу http://kilork.org/public/notify/.

З.Ы. При первой публикации не хватало wait(), что приводило к толпам зомби, поправил.

суббота, 29 января 2011 г.

Мониторинг директорий в linux с использованием dnotify

Сижу, разрабатываю себе на javascript, но вот незадача, после каждой правки надо зайти в командную строку и запустить сборку проекта. И только потом можно наконец оценить результаты трудов. Мелочь, но раз за разом лишнее нажатие начинает раздражать. Привык ведь уже в eclipse - все подкомпилируется в фоне. А вот бы штуку, которая бы смотрела, меняется ли что-то в директории, и по изменении - запускала бы команду.

Конечно, решения из сети - это что-то. Скрипты в bash, которые делают ls директории, затем diff - и если различается, то - запускаем команду. Это круто. Постепенно находим очевидную вещь - сообщить нам об изменении директории должна ОС. Есть и механизм - dnotify. Ищем дальше, находим пример в 10 строк, как это пишется на C. Ну а чем мы хуже, добавим только чуть-чуть логики, чтобы польза была от утилитки. Несколько часов мудоханий Полчаса интеллектуального труда и результат готов:



Самая прелесть в этом, что компилируется все в одну команду:
gcc dnotify.c -o dnotify

Используется следующим образом: первый аргумент - это команда для выполнения, остальные - директории, при изменении который будет позвана команда. Например:

./dnotify "echo hello" .

запускает слушание текущей директории и при изменении в ней скажет нам "hello".

kilork@pantogan:~/projects/dnotify$ ./dnotify "echo hello" .
setting handlers:
.
done.
monitoring started...
... в другом терминале ...
kilork@pantogan:~/projects/dnotify$ touch dnotify.c
... возвращаемся в первый терминал ...
3
hello

Больше всего времени я потратил на то, чтобы заставить утилитку игнорировать события, пока работает дочерний процесс (в процессе компиляции в директории может много чего поменяться, поэтому изменения в процессе компиляции мы игнорируем, хоть это и не совсем корректно, но для нашей утилиты в 5 строчек - пойдет). Для этого пришлось делать fork, и ловить SIGCHLD. Вроде работает, немного фана получено - и снова за javascript...

Исходные коды доступны в hg-репозитории по адресу http://kilork.org/public/notify/.

З.Ы. Добавил статью по inotify - http://kilork.blogspot.com/2011/02/linux-inotify.html.