Хорошая штука incron


Предпосылки

Всем известный демон “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
  1. Установка ПО
  2. Вывод таблицы демона 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”.