- Начинаем работать с Inotify
- Наблюдения (Watches)
- Простая демонстрационная программа
- Наблюдение за поддиректориями
- Автоматическая компиляция файлов
- Inotify-tools
- dnotify, inotify и fanotify
- Inotify-tools: осуществляем мониторинг изменении файловой системы в Linux
- Inotify — подсистема ядра
- Inotify-tools: знакомство и установка
- Работаем с Inotify-tools
- Заключение
- Источники и дополнительные материалы:
- Inotify или автоматизация рутинных операций с помощью incron
- Что такое inotify
- incron
Начинаем работать с Inotify
Inotify является функцией ядра Linux, предоставляющей интерфейс для отслеживания изменений файловой системы пользовательским приложениям. Эта статья демонстрирует примеры использования API Inotify для отслеживания интересующих событий и выполнения различных действий при наступлении этих событий.
Изменения файловой системы, которые можно отследить при помощи Inotify включают в себя создание, удаление или изменение директорий и файлов. Для того, чтобы начать использовать API Inotify в своих программах на языке C, вам необходимо подключить заголовочный файл sys/inotify.h .
Наблюдения (Watches)
Наблюдение лежит в основе Inotify. Вы можете использовать наблюдение для указания директории или файла, а также событий, за которыми вы хотите следить. Например, функция создания наблюдения inotify_add_watch(fd, root, IN_CREATE | IN_MODIFY | IN_DELETE) позволяет указать, что вы хотите следить за директорией, заданной переменной root, наблюдая за событиями создания, изменения и удаления файлов и директорий внутри нее, что можно понять по маске событий IN_CREATE | IN_MODIFY | IN_DELETE . Значения констант для задания маски событий находятся в в файле linux/inotify.h .
Приведенная выше функция возвращает целочисленное значение, являющееся уникальным идентификатором наблюдения, или -1 в случае ошибки. Аргумент fd является файловым дескриптором, связанным с конкретным наблюдением. Наблюдение идентифицируется при помощи пути, поэтому если вам необходимо создать другое наблюдение с таким же путем, необходимо вызвать inotify_add_watch() с тем же путем, но с другой маской событий.
Простая демонстрационная программа
Данная демонстрационная программа на языке C позволяет следить за созданием, изменением и удалением файлов и директорий внутри заданной директории:
Первым шагом при использовании Inotify должна быть инициализация этой системы при помощи функции inotify_init() , возвращающей файловый дескрипор, который может быть использован для добавления наблюдений и чтения данных событий впоследствии в приложении.
Данные событий возвращаются в виде структуры struct inotify_event (определенной в файле linux/inotify.h ), которую можно получить при помощи системного вызова read() .
Наконец, наблюдение удаляется и ресурсы, связанные с Inotify, освобождается при помощи вызовов функций inotify_rm_watch () и close() соответственно.
Наблюдение за поддиректориями
К сожалению, не существует метода для указания того, что вы хотите наблюдать за изменениями во всех поддиректориях заданной директории. Следовательно, для решения этой задачи необходимо обойти все поддиректории и создать наблюдения для каждой из них.
Следующая программа на языке C выполняет указанные действия, обходя только поддиректории заданной директории при помощи функций из заголовочного файла dirent.h и добавляет по наблюдению для каждой из них. Впоследствии, вместо того, чтобы выводить сообщения напрямую в стандартный вывод программы stdout , сообщения записываются в файл журнала с именем inotify_logger.log .
Автоматическая компиляция файлов
Теперь, когда вы имеете представление о том, как использовать Inotify в приложениях, которым требуется контролировать изменения файловой системы, давайте займемся интересным и, возможно, очень полезным делом. Используя Inotify, будем следить за изменениями директории, и в том случае, если файл исходного кода создается или изменяется, будем вызывать gcc для компиляции файла и перемещения программы в отдельную директорию /bin внутри нашей директории. Исходный код программы, который мы сохраним в файле auto_compile.c , представлен ниже:
Конечно же, вы можете легко изменить программу для компиляции и выполнения программ на других языках программирования.
Inotify-tools
Inotify-tools — это библиотека на языке C и набор программ с интерфейсом командной строки, предоставляющих доступ к функциям системы Inotify. Одним из наиболее полезных инструментов данного пакета является программа inotifywatch , которая может использоваться для наблюдения за изменениями директории и обладает большим набором функций, чем наша вторая программа.
dnotify, inotify и fanotify
Технология inotify, впервые представленная в ядре версии 2.6.36, заменила собой технологии dnotify и fanotify за короткий промежуток времени. Обратитесь к статье в LWN , чтобы узнать подробнее об этих технологиях.
Если вы посмотрите исходные коды ядра в поддиректории fs/notify , вы можете обнаружить реализации всех трех технологий, гармонично сосуществующих друг с другом.
Источник
Inotify-tools: осуществляем мониторинг изменении файловой системы в Linux
Linux — гибкая операционная система, которая вооружает пользователя широкими возможностями. Вот, например, нам необходимо осуществить мониторинг изменения файловой системы. Для этого в Linux появился отличный инструментарий, да ещё, ориентированный на консоль. О нем и пойдет речь далее.
Inotify — подсистема ядра
Inotify — это подсистема ядра Linux, которая отслеживает изменения файловой системы в Linux (открытие, чтение, создание, удаление, перемещение, изменение атрибутов и др.). Впервые данная подсистема появилась в релизе ядра 2.6.13. Другими словами, подсистема позволяет получить информацию о действиях, которые были осуществлены с любым интересующим вас файлом.
Inotify-tools: знакомство и установка
Inotify-tools — это набор утилит, которые посредством командной строки позволяют работать с подсистемой Inotify. Кроме того, составной часть проекта Inotify-tools является соответствующая библиотека — libinotifytools , которая позволяет с легкостью задействовать интерфейс, предоставляемый подсистемой Inotify.
Мы будем использовать операционную систему Ubuntu 11.10. Установка Inotify-tools в ней не займёт много времени. Что касается других дистрибутивов (последних версий), то рассматриваемый пакет утилит доступен из репозиториев для openSUSE 12.1, Debian 6.x, Arch и других.
Запустите терминал или перейдите в консоль, а затем дайте команду:
Кстати, если вы обратите внимание, то увидите, что, помимо inotify-tools будет установлен пакет — libinotifytools0. Это та самая библиотека, о которой мы говорили выше, и которая необходима для работы inotify-tools.
Работаем с Inotify-tools
В пакет inotify-tools входят следующие утилиты: inotifywatch и inotifywait . inotifywatch — эта утилита, которая дает представление о том, какую информацию можно получить с помощью подсистемы Inotify, а также осуществляет сбор статистической информации о соответствующих событиях файловой системы (открытие файлов, удаление и т. д. — далее, в этом контексте будут иметься ввиду события Inotify).
Рассмотрим на примерах, как это работает. Откройте терминал и дайте команду:
После чего вы увидите на экране примерно следующее (см. рис. 1)
Рисунок 1. inotifywatch в процессе работы
Это означает, что inotifywatch успешно запущен и осуществляет рекурсивный (опция «-r») сбор информации о действиях с файловой системой в домашнем каталоге текущего пользователя. Например, запустим браузер Mozilla Firefox и закроем его. Далее нажмём в терминале «Ctrl»+»C», чтобы остановить inotifywatch . В итоге мы увидим примерно следующее (см. рис. 2, для увеличения щелкните по рисунку мышкой).
Рисунок. 2. Вывод Inotifywatch
В этом выводе вы можете увидеть к каким файлам обращался Mozilla Firefox во время своей работы.
При помощи опции «-e» можно добиться более гибкого вывода информации от inotifywatch . Так, например, нам необходимо узнать какие файлы или каталоги во время своей работы открывает Mozilla Firefox. Дадим следующую команду:
После этого, запустим Mozilla Firefox, поработаем в нем, а затем закроем. Далее остановим в терминале, как в прошлый раз («Ctrl»+»C»), и работу самой утилиты inotifywatch . В выводе мы уже увидим все лишь три «колонки» — total, open и filename (см. рис. 3).
Рисунок 3. Вывод inotifywatch при использовании опции «-e»
Воспользовавшись справкой для данной утилиты, вы можете увидеть, что inotifywatch способна собирать информацию о довольно большом количестве событий. Получить справку по inotifywatch можно с помощью соответствующего руководства man ( man inotifywatch ), а также указав перед данной командой опцию — «-h».
Итак, inotifywatch не отображает статистику о событиях файловой системы сразу. Но, что делать когда необходимо получать информацию о событиях сразу, как они начинают происходить. Во общем, осуществлять мониторинг. В этом нам поможет вторая утилита из пакета Inotify-tools — inotifywait .
Дайте следующую команду:
где опция «-m» — указывает осуществлять мониторинг событий, без этой опции inotifywait прекратит работу после первого события; опция «-r» — указывает осуществлять рекурсивный сбор информации о действиях с файловой системой.
А запустив Mozilla Firefox, вы увидите все файлы, к которым обращается браузер, а также, действия, которые он с ними осуществляет (создание временных файлов, обращение к внутренним базам данных sqlite и т.д.).
Для получения справки по работе с inotifywait воспользуйтесь соответствующей страницей руководств, а также используйте опцию «-h».
Заключение
inotify-tools удобный инструмент мониторинга событий файловой системы. Кроме того, в ситуация, когда необходимо получить сведения о файлах и каталогах, к которым обращается та или иная программа, inotify-tools может стать лучшим решением, т. к. имеет небольшой объем и мало зависимостей, а также является интерфейсом для подсистемы ядра — Inotify.
Источники и дополнительные материалы:
2. Проект Inotify-tools на GitHub — https://github.com/rvoicilas/inotify-tools/;
3. Исходный код libinotifytools — https://github.com/rvoicilas/inotify-tools/tree/master/libinotifytools/src;
4. Сайт посвященный libinotifytools — http://inotify-tools.sourceforge.net/api/index.html;
5. К. Вервлоесем. Inotify: Следим за системой // Linux Format. — N 1. — 2011. — с. 80 — 83.
Источник
Inotify или автоматизация рутинных операций с помощью incron
До сих пор на хабре еще никто не упоминал о такой удобной подсистеме ядра linux, как inotify и использовании ее в автоматизации работы системного администратора. Хотелось бы восполнить этот пробел.
Что такое inotify
Inotify — это подсистема ядра Linux, которая позволяет получать уведомления об изменениях в файловой системе. Т.е. простыми словами — эта штука дает нам информацию о создании или изменении любого файла или директории в используемой файловой системе.
Inotify появилась в ядре аж в версии 2.6.13 и прошла проверку временем. Для ее использования написано несколько утилит, работу с одной из которых мы и рассмотрим.
incron
incron — это демон, который следит за событиями в файловой системе с помощью inotify и выполняет команду при наступлении указанного в задании события, аналогично тому, как делает это его тезка cron при наступлении указанного времени.
Устанавливаем демон средствами своего дистрибутива. У меня это выглядит вот так:
После установки стартуем демон и добавляем его в списк служб, которые запускаются при старте системы.
Теперь можно добавлять задания. Выполняется это командой incrontab -e. Можно конечно редактировать файлы и вручную… они находятся в директории /var/spool/incrontab, но лучше все же воспользоваться специально предназначенной для этого утилитой.
Здесь существует небольшая тонкость. Если при установке у вас создался файл /etc/incron.allow и в нем нету вашего имени пользователя, то следует его туда добавить, иначе вам будет запрещено работать с incron и incrontab. Если же этого файла в системе нет, то по умолчанию доступ будет разрешен всем пользователям.
Итак, проблемы с доступом мы решили. Теперь набираем incrontab -e и видим перед собой, пока еще, чистый файл, открытый в текстовом редакторе, который у вас в системе прописан по умолчанию.
Сейчас я расскажу, что туда нужно писать:
формат crontab-файла для incron
Cинтаксис crontab будет даже проще чем у классического cron.
Каждая строчка конфига должна быть следующего вида:
Теперь расшифруем что же здесь нужно писать в каждом столце: Путь — здесь надо указать полный путь к файлу или директории, за которыми мы намерены следить. Команда — тут указывается какой скрипт или какую команду требуется выполнить по наступлении события. Событие — здесь нужно указать одно из следующих видов событий:
IN_ACCESS — К файлу обращались (чтение)
IN_ATTRIB — Изменены метаданные (права, дата создания/редактирования, расширенные атрибуты, и т.д.)
IN_CLOSE_WRITE — Файл, открытый для записи, был закрыт
IN_CLOSE_NOWRITE — Файл, не открытый для записи, был закрыт
IN_CREATE — Файл/директория создан(а) в отслеживаемой директории
IN_DELETE — Файл/директория удален(а) в отслеживаемой директории
IN_DELETE_SELF — Отслеживаемый(ая) файл/директория был(а) удален(а)
IN_MODIFY — Файл был изменен
IN_MOVE_SELF — Отслеживаемый(ая) файл/директория был(а) перемещен(а)
IN_MOVED_FROM — Файл был перемещен из отслеживаемой директории
IN_MOVED_TO — Файл перемещен в отслеживаемую директорию
IN_OPEN — Файл был открыт
Также в команде можно использовать следующие внутренние переменные (очень удобные для логирования ИМХО):
$$ знак $
$@ объект нашей слежки (директория)
$# имя созданного файла
$% флаг события (текстом)
$& флаг события (цифрой)
Несколько примеров
Итак. Знаниями вооружились, теперь можно начинать автоматизировать. Наверняка многие уже поняли что и как можно сделать с помощью incron, но я все же напишу несколько примеров, для остальных.
Возьмем для примера crontab-файл взятый с моего домашнего сервера:
/etc IN_MODIFY /bin/backup
/etc/bind/pri/ IN_MODIFY rndc reload
/etc/bind/pri/named.conf IN_MODIFY /etc/init.d/named restart
/etc/apache2/ IN_MODIFY /etc/init.d/apache2 restart
/etc/squid/squid.conf IN_MODIFY /etc/init.d/squid restart
/etc/squidGuard/ IN_MODIFY /etc/init.d/squid restart
/etc/conf.d/firewall.sh IN_MODIFY /etc/conf.d/firewall.sh
В первой строке, при модификации любого файла из директории /etc запускается скрипт резервного копирования, который сохраняет все важные файлы из /etc. Благодаря утилите rsync я могу копировать только измененные файлы экономя трафик и не загружая канал попусту, но сейчас речь не об этом =).
Далее идут обычные операции перезапуска служб, при изменении их конфигурационных файлов. Как же здорово не делать это вручную каждый раз!
И в последней строчке происходит запуск скрипта конфигурации файрвола, если тот был изменен.
Как видите тут все довольно просто и банально, но зато какая подстраховка памяти =). Особенно, когда увлечен чем-то другим или еще не совсем проснулся, или наоборот очень устал.
В моем примере везде используется только событие IN_MODIFY, но я могу привести несколько надуманный, но все же рабочий пример использования другого события:
/mnt/samba/public/shutdown IN_CLOSE_WRITE shutdown now
Здесь мы выключаем компьютер, если в расшаренной папке, кто-то создал или отредактировал файл shutdown.
Источник