Предпосылки
Всем известный демон “cron” является мощным инструментом автоматического запуска команд по расписанию. Демон “incron” походит на своего собрата, но представляет собой не расписание, а триггер, реагирующий на изменения/события в файловой системе, а именно:
- 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 – файл был открыт
- IN_ALL_EVENTS – триггер на все события
Как видно из этого списка, практически все события в файловой системе могут отслеживаться.
Реакции на эти события это команды или сценарии, прописанные в таблицы демона incron.
Установка и настройка ПО
Пример для ArchLinux:
[orca@blizzard ~]$ sudo pacman -S incron <1> [orca@blizzard ~]$ sudo incrontab -u root -l <2> no table for root |
- Установка ПО
- Вывод таблицы демона incron для пользователя root
Синтаксис строки таблицы “incrond” напоминает “crond”:
<path> <mask> <command> [argument] где: - path: полное имя файла/директории - mask: маска (шаблон) события (IN_ACCESS, IN_ATTRIB и т.п.) - command: команда-реакция на событие - argument: дополнительный аргумент для команды |
В качестве аргументов могут выступать следующие ключи:
- $@ – передаёт полный путь
- $# – передаёт имя файла, связанного с событием
Пример использования
Предположим, имеется файловое хранилище, содержимое которого, в целях обеспечения избыточной надёжности, реплицируется на удалённую систему. С подобной задачей отлично справляется программа “rsync”:
[orca@blizzard ~]$ rsync -t -r -u --delete /store/source backup:/store/ |
Подразумевается, что между двумя серверами в примере (blizzard, backup) был произведён обмен ключами ssh и приведённая команда выполняется без запроса пароля доступа к серверу “backup”.
Замечание | Своим мощным функционалом rsync заслуживает отдельной публикации |
Чтобы “rsync” работал более эффективно, можно настроить incron-триггер таким образом, чтобы rsync запускался только в случаях изменения файловой системы: создание, изменение и удаление файлов. Для этого должна быть создана следующая строка в таблице “incrond”:
/store/source IN_CREATE,IN_DELETE,IN_MODIFY rsync -t -r -u –delete /store/source backup:/store/
Добавить эту строку в таблицу “incrond” и запустить демон incrond:
[orca@blizzard ~]$ sudo incrontab -u root -e [orca@blizzard ~]$ sudo incrond |
С этого момента, все изменения в директории “/store/source” сервера “blizzard” отражаются на сервере “backup”.