Автор Тема: Отслеживание событий и автоматизация с помощью Inotify  (Прочитано 7295 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн ludoed

  • Местный
  • *****
  • Автор темы
  • Сообщений: 861
  • ludoed1970@jabber.ru
В ядре Linux, похоже, запрятано до хрена интересных возможностей. Не знаю, есть ли там Святой Грааль и Общая теория всего, но вот, нашел сначала упоминания в Linux Format, а потом мануал на Хабре. Немного его переработал под свои нужды.
Выделенное синим - копия с хабра

Что такое inotify

Inotify — это подсистема ядра Linux, которая позволяет получать уведомления об изменениях в файловой системе. Т.е. простыми словами — эта штука дает нам информацию о создании или изменении любого файла или директории в используемой файловой системе.

Проще всего задействовать ее для своих целей при помощи демона incron
ставится очень просто:
sudo aptitude install incronПосле установки первое - найти файл /etc/incron.allow и вписать в него свое username (можно золотыми буквами)  ;D чтобы разрешить себе любимому использовать incron
Задания для демона аналогично cron'у определяются командой
incrontab -e

Формат файла:
<путь для слежения> <Событие> <команда/скрипт>
Особенности:
в отличие от crontab здесь не работает установка окружения
DISPLAY=:0.0т.е. не получится запускать приложения X-сервера (программы с GUI интерфейсом), по крайней мере - без выпендрежа
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 — Файл был открыт

Также в команде можно использовать следующие внутренние переменные (очень удобные для логирования ИМХО):

$$ знак $
$@ объект нашей слежки (директория)
$# имя созданного файла
$% флаг события (текстом)
$& флаг события (цифрой)

Для чего это можно пристегнуть:
1. Автоматическое резервное копирование важных файлов после их изменения
2. Автоматический рестарт различных служб (демонов) после редактирования их конфигов
и самое интересное:
3. Выполнение пользовательских скриптов

Например, я написал скрипт, который запускается при появлении в отслеживаемой папке текстового файлика со ссылками
Скрипт скачивает из инета веб-страницы по ссылкам (заточено под nnm.ru, можно сделать для многих других сайтов). Страницы скачиваются специально без картинок. Можно сделать и зеркало выбранных страниц или сайта с картинками - man wget - мне нужно было именно без картинок, для уменьшения объема
По окончании скачивания веб-страницы тем же скриптом автоматически зипуются, а затем отправляются на определенный почтовый ящик
Можно сделать и автоматическое удаление накопившегося хлама - пока еще не доделано

Зачем оно надо:
Например, уехали вы на дачу на выходные, а инет там дорогой, потому что через GPRS
Можно получать на почту новости с любимого сайта, или трекера, не чувствуя себя оторванным от мира

Скрипт (Замените <фрагменты> вашими данными):
!#/bin/bash
sleep 10; cp /home/<username>/mail/`date +%d_%m_%y`.txt /home/<username>/tmp/`date +%d_%m_%y`.txt
cd /
cd /home/<username>/tmp/
sleep 5; wget -p -i `date +%d_%m_%y`.txt --http-user=<nnm.ru_login> --http-password=<nnm.ru_password> --user-agent="Mozilla/5.0 (compatible; Konqueror/3.0.0/10; Linux)" && \
sleep 10; zip -r `date +%d_%m_%y`.zip ~/tmp/nnm.ru/blogs/*  && \
sleep 10; sendemail -f <ваш_логин>@mail.ru -t <ВАШ>@<второй_почтовый.ящик> -s smtp.mail.ru:25 -xu <Ваш логин к mail.ru> -xp <ваш_пароль_к_mail.ru> -u `date +%d_%m_%y` -m "`date +%d_%m_%y`" -a ~/tmp/`date +%d_%m_%y`.zip
строка в incrontab
/home/<username>/mail/ IN_CREATE /home/<username>tmp/wget_html.sh
все юниксы очень дружелюбны.. они просто очень разборчивы в друзьях ;)

Настоящее труЪ: самописное ядро, выращенные на кухне кристаллы и программирование перемычками :)

Оффлайн vmf

  • Местный
  • *****
  • Сообщений: 587
  • vmf000@yabber.ru
Хорошая вещь!
Я использую для обмена файлами внутри сети.
Правда вместо icron использую inotifywait из пакета inotify-tools, но механизм тот-же.
inotifywait отслеживает появление файлов в определенных каталогах и переносит их в домашние папки пользователей