<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/css" href="http://wiki2.linuxformat.ru/skins/common/feed.css?97"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
	<channel>
		<title>LXF121:Inotify - История изменений</title>
		<link>http://wiki2.linuxformat.ru/index.php?title=LXF121:Inotify&amp;action=history</link>
		<description>История изменений этой страницы в вики</description>
		<language>ru</language>
		<generator>MediaWiki 1.11.1</generator>
		<lastBuildDate>Wed, 13 May 2026 23:43:25 GMT</lastBuildDate>
		<item>
			<title>Crazy Rebel: викификация, оформление</title>
			<link>http://wiki2.linuxformat.ru/index.php?title=LXF121:Inotify&amp;diff=10513&amp;oldid=prev</link>
			<description>&lt;p&gt;викификация, оформление&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая статья&lt;/b&gt;&lt;/p&gt;&lt;div&gt;: '''''Inotify''''' Отслеживаем изменения в файловой системе Linux-компьютера&lt;br /&gt;
&lt;br /&gt;
==''Inotify'': Действия по событиям==&lt;br /&gt;
&lt;br /&gt;
: Создание, изменение и удаление файлов и каталогов – это вещи, происходящие в вашей системе по тысяче раз на дню. Их можно отследить и применить для вашего удобства, утверждает '''Николай Кузнецов'''.&lt;br /&gt;
&lt;br /&gt;
Для начала – немного теории. ''Inotify'' – это подсистема ядра Linux, позволяющая отслеживать события в файловой системе. Причем происходит это в так называемом «реактивном режиме» (то есть по событию), в отличие от режима «активного» – постоянного сканирования изменений. Это предоставляет нам достаточно эффективный механизм для самых различных нужд. И хоть появилась эта функция сравнительно недавно (начиная с ядра версии 2.6.13‑rc3), ее рождение повлекло за собой значительные и не очень улучшения в различных программах, таких как: ''Beagle'' (система индексации и быстрого поиска файлов на рабочем столе), ''auditd'' (служба аудита), ''Brasero'' (программа записи CD/DVD в GNOME), ''tailf'' (эффективный аналог команды tail -f), ''udevd'' (подсистема работы с устройствами) и многие другие. Мы же продемонстрируем возможности ''Inotify'' на примере двух утилит: ''iwatch'' и ''incron''. На данном уроке будет использоваться SUSE 11, но все действия будут аналогичными и в других дистрибутивах. Если же вы предпочтете SUSE, то сможете найти все указанные пакеты при помощи поиска на сайте http://software.opensuse.org/search.&lt;br /&gt;
&lt;br /&gt;
===iПосмотрим: ''iwatch''===&lt;br /&gt;
&lt;br /&gt;
С помощью ''iwatch'' можно легко наблюдать, какие изменения происходят в определенной части дерева каталогов файловой системы. Для примера, запустим следующую команду:&lt;br /&gt;
&lt;br /&gt;
 # iwatch -v -r /etc/&lt;br /&gt;
&lt;br /&gt;
Она будет подробно ('''-v''') сообщать обо всем, что происходит в директории '''/etc''' и во всех ее поддиректориях ('''-r'''). Теперь можно открыть вашу любимую графическую программу для настройки чего-нибудь (в SUSE попробуйте ''YaST'', в Fedora – утилиты ''system-config-...'') и посмотреть, какие изменения она вносит в общесистемные конфигурационные файлы.&lt;br /&gt;
&lt;br /&gt;
Давайте переключимся на другой терминал и выполним:&lt;br /&gt;
&lt;br /&gt;
 # touch /etc/issue&lt;br /&gt;
&lt;br /&gt;
В результате на консоли с ''iwatch'' можно будет увидеть следующее:&lt;br /&gt;
&lt;br /&gt;
 [15/Jun/2009 14:08:02] IN_CLOSE_WRITE /etc/issue&lt;br /&gt;
 [15/Jun/2009 14:08:02] * /etc/issue is closed&lt;br /&gt;
&lt;br /&gt;
Рассмотрим более сложный пример: разберемся, что происходит при создании нового пользователя командой&lt;br /&gt;
&lt;br /&gt;
 # useradd testuser&lt;br /&gt;
&lt;br /&gt;
Вывод ''iwatch'' здесь будет куда более многословным:&lt;br /&gt;
&lt;br /&gt;
 [15/Jun/2009 14:10:06] IN_CREATE /etc/passwd.tmpZRwKCR&lt;br /&gt;
 [15/Jun/2009 14:10:06] IN_CLOSE_WRITE /etc/passwd.tmpZRwKCR&lt;br /&gt;
 [15/Jun/2009 14:10:06] IN_DELETE /etc/passwd.old&lt;br /&gt;
 [15/Jun/2009 14:10:06] * /etc/passwd.old is deleted&lt;br /&gt;
 [15/Jun/2009 14:10:06] IN_CREATE /etc/passwd.old&lt;br /&gt;
 [15/Jun/2009 14:10:06] IN_MOVED_FROM /etc/passwd.tmpZRwKCR&lt;br /&gt;
 [15/Jun/2009 14:10:06] IN_MOVED_TO /etc/passwd&lt;br /&gt;
 [15/Jun/2009 14:10:06] * /etc/passwd.tmpZRwKCR is moved to /etc/passwd&lt;br /&gt;
 [15/Jun/2009 14:10:06] IN_CREATE /etc/shadow.tmpCsjybQ&lt;br /&gt;
 [15/Jun/2009 14:10:06] IN_CLOSE_WRITE /etc/shadow.tmpCsjybQ&lt;br /&gt;
 [15/Jun/2009 14:10:06] IN_DELETE /etc/shadow.old&lt;br /&gt;
 [15/Jun/2009 14:10:06] * /etc/shadow.old is deleted&lt;br /&gt;
 [15/Jun/2009 14:10:06] IN_CREATE /etc/shadow.old &lt;br /&gt;
 [15/Jun/2009 14:10:06] IN_MOVED_FROM /etc/shadow.tmpCsjybQ&lt;br /&gt;
 [15/Jun/2009 14:10:06] IN_MOVED_TO /etc/shadow&lt;br /&gt;
 [15/Jun/2009 14:10:06] * /etc/shadow.tmpCsjybQ is moved to /etc/shadow&lt;br /&gt;
 [15/Jun/2009 14:10:06] IN_CREATE /etc/group.tmpfr7KLO&lt;br /&gt;
 [15/Jun/2009 14:10:06] IN_CLOSE_WRITE /etc/group.tmpfr7KLO&lt;br /&gt;
 [15/Jun/2009 14:10:06] IN_DELETE /etc/group.old&lt;br /&gt;
 [15/Jun/2009 14:10:06] * /etc/group.old is deleted&lt;br /&gt;
 [15/Jun/2009 14:10:06] IN_CREATE /etc/group.old&lt;br /&gt;
 [15/Jun/2009 14:10:06] IN_MOVED_FROM /etc/group.tmpfr7KLO&lt;br /&gt;
 [15/Jun/2009 14:10:06] IN_MOVED_TO /etc/group&lt;br /&gt;
 [15/Jun/2009 14:10:06] * /etc/group.tmpfr7KLO is moved to /etc/group&lt;br /&gt;
 [15/Jun/2009 14:10:06] IN_CREATE /etc/group.tmpwsLtmN&lt;br /&gt;
 [15/Jun/2009 14:10:06] IN_CLOSE_WRITE /etc/group.tmpwsLtmN&lt;br /&gt;
 [15/Jun/2009 14:10:06] IN_DELETE /etc/group.old&lt;br /&gt;
 [15/Jun/2009 14:10:06] * /etc/group.old is deleted&lt;br /&gt;
 [15/Jun/2009 14:10:06] IN_CREATE /etc/group.old&lt;br /&gt;
 [15/Jun/2009 14:10:06] IN_MOVED_FROM /etc/group.tmpwsLtmN&lt;br /&gt;
 [15/Jun/2009 14:10:06] IN_MOVED_TO /etc/group&lt;br /&gt;
 [15/Jun/2009 14:10:06] * /etc/group.tmpwsLtmN is moved to /etc/group&lt;br /&gt;
 [15/Jun/2009 14:10:06] IN_CLOSE_WRITE /etc/.pwd.lock&lt;br /&gt;
 [15/Jun/2009 14:10:06] * /etc/.pwd.lock is closed&lt;br /&gt;
&lt;br /&gt;
В листинге видны следующие ''inotify''-события: &lt;br /&gt;
* '''IN_CREATE''' – был создан файл или директория;&lt;br /&gt;
* '''IN_MOVED_FROM\IN_MOVED_TO''' – файл перемещался (откуда и куда),&lt;br /&gt;
* '''IN_DELETE''' – файл был удален,&lt;br /&gt;
* '''IN_CLOSE_WRITE''' – файл был закрыт после открытия в режиме для записи.&lt;br /&gt;
&lt;br /&gt;
Из вывода ''iwatch'' становится ясно, какие файлы создавались/перемещались/удалялись во время выполнения команды ''useradd''. В целом, картина известная: изменяются файлы '''/etc/passwd''', '''/etc/shadow''' и '''/etc/group''', а их старые копии сохраняются в '''/etc/passwd.old, /etc/shadow.old''' и '''/etc/group.old''', соответственно. А вот про существование файла '''/etc/.pwd.lock''' я, например, не знал.&lt;br /&gt;
&lt;br /&gt;
Кстати, обратите внимание, как происходит изменение файлов. Содержимое не перезаписывается: вместо этого создается новый временный файл, в который вносятся все необходимые строки, после чего он переименовывается. Помните споры вокруг проблем с отложенной записью в ''ext4''? Отрадно понимать,&lt;br /&gt;
что ''useradd'' (как, впрочем, и все грамотно написанные приложения Unix) этой проблеме не подвержен.&lt;br /&gt;
&lt;br /&gt;
Получив представление о событиях ''Inotify'', приступим к настройке службы ''incron''.&lt;br /&gt;
&lt;br /&gt;
===inПопланируем: ''incron''===&lt;br /&gt;
&lt;br /&gt;
Что же такое ''incron''? Это – вариация службы ''Сron'', выполняющая задания по событиям ''Inotify'', а не по таймеру. Давайте реализуем при его помощи автоматическую сортировку по типам для файлов, сбрасываемых на рабочий стол пользователя ''testuser'': музыка – в один каталог, фотоснимки – в другой, и так далее.&lt;br /&gt;
&lt;br /&gt;
Для этого создаем правило ''incron'', запустив следующую команду:&lt;br /&gt;
&lt;br /&gt;
 # incrontab -e&lt;br /&gt;
&lt;br /&gt;
и набрав такую строку:&lt;br /&gt;
&lt;br /&gt;
 /home/testuser/Desktop IN_CREATE /usr/local/bin/Download_Sort.sh $#&lt;br /&gt;
&lt;br /&gt;
Таким образом, мы будем отслеживать событие '''In_CREATE''' (появление нового файла или директории) в каталоге '''/home/testuser/Desktop''', и в случае, если оно произойдет, запускать скрипт '''/usr/local/bin/Download_Sort.sh''', передавая ему в качестве аргумента имя созданного файла (оно, согласно документации ''incron'', хранится в переменной '''$#''').&lt;br /&gt;
&lt;br /&gt;
Далее, создаем сам сценарий '''/usr/local/bin/Download_Sort.sh''':&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Заголовок=Скорая помощь|Содержание=Вместо редактора по умолчанию (''Vim'') правила ''incron'' можно вводить при помощи любого другого, предварительно выполнив команду вроде ''export EDITOR=gedit'' или ''export EDITOR=mcedit'', то есть установив переменную окружения '''$EDITOR'''.|Ширина=150px}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 DIR=/home/testuser/Desktop&lt;br /&gt;
 {&lt;br /&gt;
 echo “File: $i”&lt;br /&gt;
 case “$1” in&lt;br /&gt;
      *.avi|*.flv|*.vob)&lt;br /&gt;
         mv -v “$DIR/$1” $DIR/Downloads/_Video&lt;br /&gt;
      ;;&lt;br /&gt;
      *.png|*.gif|*.jpg)&lt;br /&gt;
         mv -v “$DIR/$1” $DIR/Downloads/_Pics&lt;br /&gt;
      ;;&lt;br /&gt;
      *.pdf|*.djvu)&lt;br /&gt;
         mv -v “$DIR/$1” $DIR/Downloads/_eBooks&lt;br /&gt;
      ;;&lt;br /&gt;
      *.zip)&lt;br /&gt;
         newDIR=”$DIR/Downloads/_ZIPs/${1%.*}”&lt;br /&gt;
         mkdir “$newDIR”&lt;br /&gt;
           sleep 20; while [ -f “$DIR/$1.part” ]; do sleep 5; done&lt;br /&gt;
         unzip “$DIR/$1” -d “$newDIR/”&lt;br /&gt;
         mv -v “$DIR/$1” “$newDIR/”&lt;br /&gt;
         chown -R testuser “$newDIR”&lt;br /&gt;
      ;;&lt;br /&gt;
      *)&lt;br /&gt;
         echo “ - None”&lt;br /&gt;
      ;;&lt;br /&gt;
 esac&lt;br /&gt;
 } &amp;amp;&amp;gt; /tmp/Download_Sort.log&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Принцип его работы очень прост: файлы распознаются по расширениям (при желании сделать скрипт более «интеллектуальным» можно использовать команду ''file''). Видеоролики перемещаются в папку '''_Video''', картинки – в '''_Pics''', документы PDF и DjVu – в '''_eBooks''', Zip-архивы распаковываются в '''_ZIPs''', файлы неизвестных форматов остаются на рабочем столе. Кроме этого, результат и ошибки обработки последнего файла сохраняются в '''/tmp/Download_Sort.log''' для проверки и тестирования работы скрипта. Сообщения службы ''incrond'' можно также просмотреть в системном журнале ('''/var/log/messages''' или аналогичном). Они имеют стандартный вид:&lt;br /&gt;
&lt;br /&gt;
 Jun 15 14:36:11 hostname incrond[4728]: (root) CMD (/usr/local/bin/Download_Sort.sh Pinguins.zip)&lt;br /&gt;
&lt;br /&gt;
Теперь создадим '''/home/testuser/Desktop/Downloads''' и соответствующие поддиректории для разных типов файлов:&lt;br /&gt;
&lt;br /&gt;
 mkdir -p /home/testuser/Desktop/Downloads/_{Video,Pics,eBooks,ZIPs}&lt;br /&gt;
&lt;br /&gt;
Установим права, необходимые для запуска скрипта и для нормальной работы пользователя с его каталогами:&lt;br /&gt;
&lt;br /&gt;
 chmod a+rx /usr/local/bin/Download_Sort.sh&lt;br /&gt;
 chown -R testuser /home/testuser/Desktop/Downloads&lt;br /&gt;
&lt;br /&gt;
И, наконец, запустим службу, которая будет отслеживать для нас события:&lt;br /&gt;
&lt;br /&gt;
 /etc/init.d/incron start&lt;br /&gt;
&lt;br /&gt;
Ее можно добавить и в автозапуск, если вы хотите, чтобы она самостоятельно стартовала после перезагрузки компьютера:&lt;br /&gt;
&lt;br /&gt;
 chkconfig incron on&lt;br /&gt;
&lt;br /&gt;
Вот и всё: теперь можно сбрасывать на рабочий стол (в каталог '''/home/testuser/Desktop''') различные файлы и смотреть, что с ними происходит.&lt;br /&gt;
&lt;br /&gt;
Для наглядности, здесь приведен достаточно простой вариант скрипта. Желающие могут написать свой или расширить предложенный: например, добавив действия для RPM (установка или прописывание в локальный репозиторий), JAR (перенос на смартфон), EXE (проверка антивирусом), WAR (их – Tomcat’у), FLV (перекодирование в AVI), MP3 (в Ogg) и т. д., и т. п.&lt;br /&gt;
&lt;br /&gt;
Кроме того, с помощью ''incron'' можно легко реализовать следующие идеи: &lt;br /&gt;
* Забыть про перезапуск сервисов после правки файлов конфигурации– этим займется ''incron'', следящий за их изменением.&lt;br /&gt;
* Реализовать свою достаточно гибкую службу квот и аудита.&lt;br /&gt;
* Автоматически добавлять в свою web-галерею папку с картинками при копировании, например, в '''/srv/www/htdocs/images'''.&lt;br /&gt;
&lt;br /&gt;
Уверен, вы сможете придумать и свои собственные способы для удобного использования данного инструмента.&lt;br /&gt;
&lt;br /&gt;
===Выбор есть всегда===&lt;br /&gt;
&lt;br /&gt;
Разумеется, ваше взаимодействие с ''Inotify'' не ограничивается ''iwatch'' с ''incron'': в Linux есть весь необходимый инструментарий. Программистам на C обычно достаточно подключить заголовочный файл '''&amp;lt;linux/inotify.h&amp;gt;''', разработчикам на ''Perl'' и ''Python'' пригодятся пакеты '''python-pyinotify''' и '''perl-Linux-Inotify2''', web-программистам – '''php5‑inotify...''' модуль ''Inotify'' есть даже в ''Compiz''! В скриптах удобно пользоваться утилитой ''inotifywait'' из пакета '''inotify-tools''' – как следует из названия, она позволяет приостановить сценарий в ожидании какого-либо события файловой системы. '''LXF'''&lt;/div&gt;</description>
			<pubDate>Wed, 07 Jul 2010 05:13:11 GMT</pubDate>			<dc:creator>Crazy Rebel</dc:creator>			<comments>http://wiki2.linuxformat.ru/index.php/%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:LXF121:Inotify</comments>		</item>
	</channel>
</rss>