6 мая 2015 г.

Отслеживание действий с файлами или папками в Ubuntu с помощью iwatch

Отслеживаем изменения файлов

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

iwatch

Для работы с этой подсистемой я выбрал утилитку iwatch, которая показалась мне довольно удобной по причине того, что она умеет выполнять команды при возникновении какого-либо события, отправлять уведомление на электронную почту, фильтровать отслеживаемые файлы, а так же поддерживает работу в режиме демона. Но начнем с более простого консольного режима.

iwatch - консольный режим

В самом простом случае для запуска достаточно указать команду в таком формате:
iwatch "путь к директории или файлу"
Если указали директорию и нужно рекурсивно просмотреть все поддиректории, то добавим опцию -r:
iwatch -r "путь к директории или файлу"
Но в таком формате iwatch будет отслеживать события по-умолчанию, в которые не входит события доступа и изменения (события по-умолчанию: close_write, create, delete, move, delete_self and move_self).
Чтобы нам указать, какие события нужно отслеживать, добавим опцию -e:
iwatch -r -e default,modify "путь к директории или файлу"
Попробуем отследить изменения файлов в директории командой:
iwatch -r -e default,modify petrenko/
Поменяем один символ в файле и сохраним его. В результате получим:
[ 5/мая/2015 23:36:50] IN_CLOSE_WRITE petrenko/flex/lab2/flex2_1.l
[ 5/мая/2015 23:36:50] * petrenko/flex/lab2/flex2_1.l is closed
[ 5/мая/2015 23:36:56] IN_MODIFY petrenko/flex/lab2/flex2_1.l
[ 5/мая/2015 23:36:56] IN_CLOSE_WRITE petrenko/flex/lab2/flex2_1.l
[ 5/мая/2015 23:36:56] * petrenko/flex/lab2/flex2_1.l is closed
Хорошо видно, что происходило с файлом во время наших манипуляций. 

iwatch поддерживает большой набор событий, опишем самые основные из них:
access - был доступ к файлу
modify - файл был изменен
attrib - изменились атрибуты файла
close_write - файл закрыт после открытия в режиме записи
close_nowrite - файл закрыт после открытия в режиме только для чтения
close - файл закрыт, независимо, после чтения или записи
open - файл был открыт
moved_from - файл был перемещен в другое место
moved_to - файл был перемещен в отслеживаемую директорию
move - файл или директория были перемещены
create - создан файл в отслеживаемых директориях
delete - удален файл в отслеживаемых директориях
delete_self - отслеживаемый файл удален
unmount - файловая система, на которой находится отслеживаемый файл, размонтирована
isdir - событие с директорией
default - стандартные события

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

iwatch - фильтруем отслеживаемые файлы

Для фильтрации у нас есть три опции:
-t <строка фильтра> - указываем строку (в формате регулярных выражений), по которой будут выбраны файлы или директории
-X <строка фильтра> - указываем фильтр, по которому будут исключены файлы или директории
-x <имя файла или директории> - указываем файл или директорию, которые будут исключены из отслеживаемых

Чтобы отслеживать доступ к файлам в формате flac:
iwatch -r -e access -t '.flac' Музыка/
Чтобы исключить из отслеживаемых все скрытые файлы, введем:
iwatch -r -e access -X '/\.' petrenko/

iwatch - выполняем команду при событии

Чтобы выполнить команду при возникновении события, используем опцию , например, чтобы вывести уведомление в системе при изменении файла:
iwatch -r -c "notify-send iwatch 'Событие %e в %f'" -e modify petrenko/
У iwatch есть возможность подставлять информацию о событии на места спецификаторов, в примере выше использованы %e и %f, которые означают имя события и путь к файлу или директории, с котором это событие произошло. 

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

На этом закончим, о работе в режиме демона читайте в следующей части статьи.

Комментариев нет:

Отправить комментарий