До сих пор на хабре еще никто не упоминал о такой удобной подсистеме ядра linux, как inotify и использовании ее в автоматизации работы системного администратора. Хотелось бы восполнить этот пробел.
Inotify — это подсистема ядра Linux, которая позволяет получать уведомления об изменениях в файловой системе. Т.е. простыми словами — эта штука дает нам информацию о создании или изменении любого файла или директории в используемой файловой системе.
Inotify появилась в ядре аж в версии 2.6.13 и прошла проверку временем. Для ее использования написано несколько утилит, работу с одной из которых мы и рассмотрим.
incron — это демон, который следит за событиями в файловой системе с помощью inotify и выполняет команду при наступлении указанного в задании события, аналогично тому, как делает это его тезка cron при наступлении указанного времени.
Устанавливаем демон средствами своего дистрибутива. У меня это выглядит вот так:
kolvir ~ # emerge incron
После установки стартуем демон и добавляем его в списк служб, которые запускаются при старте системы.
Теперь можно добавлять задания. Выполняется это командой incrontab -e. Можно конечно редактировать файлы и вручную… они находятся в директории /var/spool/incrontab, но лучше все же воспользоваться специально предназначенной для этого утилитой.
Здесь существует небольшая тонкость. Если при установке у вас создался файл /etc/incron.allow и в нем нету вашего имени пользователя, то следует его туда добавить, иначе вам будет запрещено работать с incron и incrontab. Если же этого файла в системе нет, то по умолчанию доступ будет разрешен всем пользователям.
Итак, проблемы с доступом мы решили. Теперь набираем incrontab -e и видим перед собой, пока еще, чистый файл, открытый в текстовом редакторе, который у вас в системе прописан по умолчанию.
Сейчас я расскажу, что туда нужно писать:
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 запускается скрипт резервного копирования, который сохраняет все важные файлы из /etc. Благодаря утилите rsync я могу копировать только измененные файлы экономя трафик и не загружая канал попусту, но сейчас речь не об этом =).
Далее идут обычные операции перезапуска служб, при изменении их конфигурационных файлов. Как же здорово не делать это вручную каждый раз!
И в последней строчке происходит запуск скрипта конфигурации файрвола, если тот был изменен.
Как видите тут все довольно просто и банально, но зато какая подстраховка памяти =). Особенно, когда увлечен чем-то другим или еще не совсем проснулся, или наоборот очень устал.
В моем примере везде используется только событие IN_MODIFY, но я могу привести несколько надуманный, но все же рабочий пример использования другого события:
Здесь мы выключаем компьютер, если в расшаренной папке, кто-то создал или отредактировал файл shutdown.
Подробнее о программном интерфейсе, а также об остальных утилитах можно узнать здесь: ru.wikipedia.org/wiki/Inotify или здесь: www.ibm.com/developerworks/ru/library/l-ubuntu-inotify
Что такое inotify
Inotify — это подсистема ядра Linux, которая позволяет получать уведомления об изменениях в файловой системе. Т.е. простыми словами — эта штука дает нам информацию о создании или изменении любого файла или директории в используемой файловой системе.
Inotify появилась в ядре аж в версии 2.6.13 и прошла проверку временем. Для ее использования написано несколько утилит, работу с одной из которых мы и рассмотрим.
incron
incron — это демон, который следит за событиями в файловой системе с помощью inotify и выполняет команду при наступлении указанного в задании события, аналогично тому, как делает это его тезка cron при наступлении указанного времени.
Устанавливаем демон средствами своего дистрибутива. У меня это выглядит вот так:
kolvir ~ # emerge incron
После установки стартуем демон и добавляем его в списк служб, которые запускаются при старте системы.
Теперь можно добавлять задания. Выполняется это командой 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.
Ссылки
Подробнее о программном интерфейсе, а также об остальных утилитах можно узнать здесь: ru.wikipedia.org/wiki/Inotify или здесь: www.ibm.com/developerworks/ru/library/l-ubuntu-inotify