Содержание


Incron

Планирование операций обработки событий в файловой системе

Comments

Серия контента:

Этот контент является частью # из серии # статей: Incron

Следите за выходом новых статей этой серии.

Этот контент является частью серии:Incron

Следите за выходом новых статей этой серии.

Большинству пользователей Linux хорошо знакома удобная утилита cron, предназначенная для планирования и выполнения разнообразных операций в заданное время. Но что, если действие должно быть выполнено не при наступлении определенного момента времени, а при возникновении некоторого события в файловой системе (например, создания или удаления файла, изменения содержимого каталога и т.д.)? В этом случае может оказаться полезным пакет программ incron.

Знакомство с incron

Пакет incron основан на inotify - подсистеме Linux-ядра, которая занимается отслеживанием изменений в файловой системе и сообщает о них заинтересованным приложениям. Название программы произошло от сокращения и объединения названий двух данных подсистем: "INotify CRON".

Сам по себе пакет incron не очень большой, так, в его состав входят:

  • программа-демон (incrond);
  • программа, обеспечивающая редактирование таблицы событий (incrontab);
  • конфигурационный файл (incron.conf);
  • соответствующие страницы справочника man.

Скачать пакет incron можно на сайте автора - Лукаса Елинека (Lukas Jelinek) или поискать в репозиториях используемого Linux-дистрибутива (в репозиториях Fedora и Debian пакеты incron присутствуют).

С помощью пакета incron можно решать самые разнообразные задачи, начиная с простого мониторинга и сбора статистики об объектах файловой системы и оповещения об изменениях конфигурационных файлов или почтовых ящиков. В более сложных ситуациях incron может применяться для защиты важных файлов от изменений и автоматического создания резервных копий при изменении заданного набора файлов или каталогов.

Использование incron

Поскольку incron является в некоторой степени "родственником" cron, то и принципы использования этих программ и их пользовательский интерфейс также схожи между собой. Каждый пользователь, обладающий правами для работы с incron, обращается к программе incrontab для просмотра или редактирования списка своих правил (задач). Программа-демон (incrond) обрабатывает эти правила, и при наступлении события, указанного в одном из правил, выполняет соответствующую команду.

Для просмотра текущей таблицы правил используется команда incrontab -l, а для редактирования правил - команда incrontab -e. Редактирование выполняется с помощью текстового редактора, определённого в системной переменной EDITOR. Если для работы с таблицей incrontab необходимо выбрать другой редактор, не изменяя значения EDITOR, то в конфигурационный файл /etc/incron.conf следует вписать следующую строку:

editor = имя_требуемого_редактора

При этом следует помнить о предупреждении автора программы Лукаса Елинека, который не рекомендует использовать редакторы с графическим интерфейсом (gvim, KEdit, gedit и т.п.) из-за возможных проблем при взаимодействии с X-сервером. Более предпочтительны в данном случае такие редакторы, как vim, emacs, nano и т.д.

С помощью команды incrontab -r пользователь может удалить свою текущую таблицу правил, при этом никаких предупреждений и запросов на подтверждение удаления не выводится, поэтому этой командой следует пользоваться с осторожностью. После добавления всех необходимых правил в таблицу, её можно сохранить в файле с помощью следующей команды:

incrontab -l > myincrontab.backup

Однако восстанавливать правила в случае удаления таблицы все равно придётся вручную.

Демон incrond незамедлительно реагирует на внесение изменений в правила и сразу перезагружает отредактированную таблицу. Но эти изменения не повлияют на команды, которые уже выполняются в текущий момент. Остановить работу текущего активного демона incrond можно с помощью следующих команд:

  incrond -k
  incrond --kill

После установки пакета incron может случиться так, что никто из пользователей (в том числе и суперпользователь root) не будет иметь прав на работу с таблицами правил. В этом случае потребуется добавить имена учетных записей пользователей, допущенных к работе с incron, в файл /etc/incron.allow. Иногда встречаются советы удалить файл /etc/incron.allow для того, чтобы все локальные пользователи получили доступ к incron, но этот шаг выглядит чрезмерным и небезопасным (сам автор программы признаёт это и намеревается в следующих версиях усовершенствовать механизм разрешения доступа).

Формат строк правил (задач)

Строки в таблице правил (задач) имеют следующий синтаксис:

<путь_к_файлу>  <маска_флагов_событий>  <команда>
  • &lt;путь_к_файлу&gt; - наилучшим вариантом будет указание полного пути к отслеживаемому файлу или каталогу. Если в записи пути встречаются пробелы, то перед каждым символом пробела должен быть указан символ "обратная косая черта " (\).
  • &lt;маска_флагов_событий&gt; - символьная или числовая маска, представляющая комбинацию отслеживаемых событий. При символьной записи маски флаги различных событий отделяются друг от друга запятыми.
  • &lt;команда&gt; - как и при использовании cron, командой может быть имя выполняемого файла (программы) или имя сценария, который следует выполнить при наступлении заданных маской событий.

Элементы строки отделяются друг от друга произвольным количеством пробелов или табуляций.

В маску могут быть включены флаги событий, перечисленных в таблице 1.

Таблица 1. Список событий, отслеживаемых incron.
СобытиеНазначение

IN_ACCESS

для отслеживания доступа к файлу (чтения из файла).

IN_MODIFY

для отслеживания изменения содержимого файла (записи в файл).

IN_ATTRIB

для отслеживания изменения метаданных файла (прав доступа, меток времени доступа и модификации, расширенных атрибутов и т.д.).

IN_CLOSE_WRITE

для отслеживания закрытия файла, ранее открытого для записи

IN_CLOSE_NOWRITE

для отслеживания закрытия файла, который был открыт без разрешения записи в него.

IN_OPEN

для отслеживания открытия файла.

IN_MOVED_FROM

для отслеживания перемещения файла из наблюдаемого каталога.

IN_MOVED_TO

для отслеживания перемещения файла в наблюдаемый каталог.

IN_CREATE

для отслеживания создания файла/подкаталога в наблюдаемом каталоге.

IN_DELETE

для отслеживания удаления файла/подкаталога в наблюдаемом каталоге.

IN_DELETE_SELF

для отслеживания удаления самого наблюдаемого каталога.

IN_CLOSE

для отслеживания закрытия файла без учёта дополнительных условий.

IN_MOVE

для отслеживания перемещения файла/каталога.

IN_ONESHOT

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

IN_ALL_EVENTS

определяет комбинацию всех возможных событий.

IN_ONLYDIR

для отслеживания событий, относящихся только к каталогам.

IN_MOVE_SELF

для отслеживания перемещения самого наблюдаемого каталога.

Получить список всех флагов событий, поддерживаемых в текущей версии incron, можно с помощью следующих команд:

  incrontab -t
  incrontab --types

После запуска любой из этих двух команд список флагов, разделённых запятыми, будет направлен на устройство стандартного вывода.

Как указывает автор, сам по себе демон incrond не защищён от проблемы бесконечного зацикливания. То есть, не исключена ситуация, когда некоторое событие инициализировало выполнение соответствующей команды, что опять приводит к наступлению этого же события и т.д. (например, для обработки события типа IN_ATTRIB применяется команда chmod.) Защиту от зацикливания при обработке событий должен взять на себя пользователь, записав в маску специальный флаг IN_NO_LOOP. При этом временно запрещается обработка всех событий для данного правила до тех пор, пока текущее событие не будет полностью обработано. После завершения обработки отслеживание заданных событий будет автоматически возобновлено. Недостатком такого подхода является потеря тех событий, которые были сгенерированы в интервале, когда обработка по данному правилу была запрещена.

В спецификацию команды для удобства могут быть включены следующие шаблоны:

  • $@ - путь в файловой системе, который был указан в таблице правил в элементе &lt;путь_к_файлу&gt;;
  • $# - имя файла, связанного с отслеживаемым событием;
  • $% - флаги событий, представленные в символьной форме;
  • $&amp; - числовое значение маски флагов;
  • $$ - для записи самого символа доллара.

Примеры использования incron

В некоторых системах документы для печати направляются не напрямую на принтер, а в специально организованный каталог заданий на печать, именуемый спулингом. Для отслеживания появления заданий в спулинге в incrontab можно написать простое правило:

/tmp/spool IN_CLOSE_WRITE /usr/local/bin/print_spool $@/$#

Теперь после завершения записи и закрытия файла в спулинге будет инициализирован сценарий, позволяющий выполнить печать заданного файла. Имя файла (с указанием полного пути к нему) передаётся в сценарий, как аргумент, при помощи ранее рассмотренных шаблонов.

Если суперпользователю root разрешено использовать incron, то можно организовать резервное копирование конфигурационных файлов с историей их изменения (т.е. каждый файл снабжается меткой времени). Для этого "от имени" суперпользователя root создаётся сценарий incron_bckp.sh (см. листинг 1), который размещается в каталоге /usr/local/sbin.

Листинг 1. Сценарий для резервного копирования измененных конфигурационных файлов
  #!/bin/sh
  mkdir -p /var/backup/incron
  # копирование изменённого файла
  cp -p --parents $1 /var/backup/incron
  # переименование скопированного файла для снабжения его меткой времени
  mv /var/backup/incron$1 /var/backup/incron$1_`date +%Y-%m-%d_%H-%M-%S`

Этот сценарий необходимо сделать выполняемым с помощью следующей команды:

chmod 755 /usr/local/sbin/incron_bckp.sh

После этого необходимо открыть таблицу правил, как показано ниже:

incrontab -e

и добавить в нее следующие строки:

  /etc IN_CLOSE_WRITE,IN_MODIFY /usr/local/sbin/incron_bckp.sh $@/$#
  /usr/etc IN_CLOSE_WRITE,IN_MODIFY /usr/local/sbin/incron_bckp.sh $@/$#
  /usr/local/etc IN_CLOSE_WRITE,IN_MODIFY /usr/local/sbin/incron_bckp.sh $@/$#

После выполнения указанных действий изменения в системных конфигурационных файлах будут фиксироваться.

Иногда возникают ситуации, в которых требуется защитить некоторый файл от изменений после записи в него важной информации. Например, ожидается критическое предупреждение от локального почтового сервиса, которое не должно быть утеряно или затёрто последующими сообщениями и т.д. При этом операция защиты файла от изменений должна быть выполнена только один раз (после её завершения соответствующее правило incron теряет смысл). Для выполнения этой задачи можно создать следующую запись в incrontab:

/home/alex/.mail.local/warning.msg IN_CLOSE_WRITE,IN_ONESHOT chmod 440 $@

Заключение

Сервис incron позволяет без затруднений организовать обработку событий, происходящих в файловой системе, причем отслеживать события можно избирательно, как для единственного файла, так и для целого дерева подкаталогов. Диапазон отслеживаемых событий достаточно широк: учтены практически все возможные варианты событий в файловой системе.


Ресурсы для скачивания


Комментарии

Войдите или зарегистрируйтесь для того чтобы оставлять комментарии или подписаться на них.

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Linux, Open source
ArticleID=755170
ArticleTitle=Incron: Планирование операций обработки событий в файловой системе
publish-date=09012011