Incrontab
Содержание
incrontab - таблица наблюдения incron
incron: - это демон запускающий программы по событиям файловой системы, аналогично тому как старый добрый cron их запускает по расписанию.
Синтаксис
incrontab [-u user] [-f config] file
incrontab [-u user] [-f config] [-l | -r | -e | -t | -d]
Описание
В файлах incrontab содержатся инструкции службы inotify cron (incron). Существуют два типа таблиц incrontab - системные - с правами root, и пользовательские с правами пользователей.
Системные таблицы находятся по умолчанию в /etc/incron.d/ и могут иметь различные имена.Каждая системная таблица существует отдельно внутри incron, и их наблюдения никогда не пересекаются.
У каждого пользователя есть их собственная пользовательская таблица incrontab, команды которой будут выполняться с привилегиями этого пользователя. У системных пользователей (таких как apache, postfix, nobody и т.д.) не может быть своего собственного incrontab.
Командой incrontab можно создавать, удалять, изменять и просматривать пользовательскую таблицу.
Файлы incrontab читаются, когда incrond (8) стартует и отслеживаются после любого изменения incrontab файла, пока incrond работает.
Формат файлов incrontab
<path> <mask> <command>
Пустые строки игнорируются.
Где путь <path> - абсолютный путь за которым устанавливается наблюдение, <mask> - Перечень событий (в символьной или числовой форме), и <command> - исполняемый файл (или скрипт) с его параметрами. Ниже приведен перечень возможных событий <mask>. Исполняемый файл может быть задан с абсолютным путем, или только именем программы (если пути известны системе).
Пожалуйста помните, что путь <path> может быть поставлен на наблюдение только один раз на каждую таблицу (иначе, только первое упоминание имеет силу, и сообщение об ошибках отправляется системному файлу регистрации).
Обозначение событий
IN_ACCESS Доступ к файлу (чтение) (*) IN_ATTRIB Изменились метаданные (permissions, timestamps, extended attributes, etc.) (*) 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.
Дополнительно могут быть применены псевдонимы:
IN_MOVE - который является комбинацией событий IN_MOVED_FROM и IN_MOVED_TO IN_CLOSE - как комбинация IN_CLOSE_WRITE и IN_CLOSE_NOWRITE.
Кроме того могут употребляться директивы:
IN_DONT_FOLLOW Не разыменовывать путь если это символическая ссылка. IN_ONESHOT Отслеживать путь только до первого события. IN_ONLYDIR наблюдать только если это каталог.
спецсимволы-переменные командной строки <command>
$$ Символ доллара $@ наблюдаемый путь $# имя файла с которым произошло наблюдаемое событие $% наблюдаемое событие (в текстовом виде) $& код события (в числовом виде)
примеры
Приведем примеры правил используемых в файлах конфигурации incrontab.
/tmp IN_ALL_EVENTS abcd $@/$# $% /usr/bin IN_ACCESS,IN_NO_LOOP abcd $# /home IN_CREATE /usr/local/bin/abcd $# /var/log 12 abcd $@/$#
Первая строчка задает правило отслеживания всех возможных событий в каталоге /tmp. Когда событие происходит запускается программа abcd, которой в качестве параметров передаются 2 поля: первое- полный путь и имя файла второе событие в текстовом виде.
Второй пример показывает как отслеживать чтение из каталога /usr/bin. Приложение abcd запускается как обработчик, и соответствующее наблюдение будет заблокировано до завершения программы abcd. Имя файла без указания пути передается как аргумент обработчику.
Параметр IN_NO_LOOP КРАЙНЕ важен в некоторых случаях и требует пояснения, ибо сам incron не имеет защиты от зацикливания. Этот параметр как раз позволяет избежать его, например, в случае, когда мы наблюдаем за изменением файла, и меняем его же содержимое согласно некоему правилу, при этом мониторинг замораживается до окончания выполнения команды abcd - зацикливания не будет.
Третье правило следит за созданием новых файлов и директорий в каталоге /home. (Например это практически всегда встречается при регистрации новых пользователей). Программа обработчик указана с полным абсолютным путем.
Последняя строчка показывает возможность применения числовой маски событий. в данном случае 12 - соответствует событиям IN_ATTRIB,IN_CLOSE_WRITE.
От себя добавлю, что в качестве разделителя в строках файлов конфигурации воспринимается только ОДИН пробел, на табуляцию или несколько пробелов incron реагирует не корректно, записывая в syslog ошибку 'cannot exec process: No such file or directory'. То есть пример выше должен выглядеть так:
/tmp IN_ALL_EVENTS abcd $@/$# $% /usr/bin IN_ACCESS,IN_NO_LOOP abcd $# /home IN_CREATE /usr/local/bin/abcd $# /var/log 12 abcd $@/$#
Где поискать ещё доки :))
man incrond, man 1 incrontab, man 5 incrontab, man incron.conf
- Статья на википедии о подсистеме ядра Линукс на которой основана работа incron
- API подсистемы inotify для языка C Статья на сайте IBM
примечания автора перевода
Настоящий перевод - это небольшой микс из man 1 incrontab и man 5 incrontab.
Надо сказать что сам incron произвел на меня сильное впечатление.
Так, например, занимаясь настройкой HylaFax сервера и интеграцией с корпоративной системой документооборота, я столкнулся с нехваткой данных передаваемых механизмом интеграции HylaFax. А incron изящно сделал вообще не нужными какие то частные механизмы связей программ. Или, например, представьте теперь насколько просто подключить антивирус к тому что пишут пользователи через самбу ?
Без преувеличения, это такое же сильное дополнение linux'a как и величественный cron.
PS
С радостью принимаются замечания и обсуждения ! :) С не меньшей радостью принимаются благодарности, как письменные так и в виде яндекс.денег: 41001101259634 которых не жалко, если мой скромный труд вам помог :))