LXF139:Inotify

Материал из Linuxformat.

Перейти к: навигация, поиск
Inotify Этот удоб­ный мо­дуль яд­ра сле­дит за ва­шей фай­ло­вой сис­те­мой, как яс­т­реб

Содержание

Inotify: Сле­дим за сис­те­мой

Ко­эн Верв­лое­сем лю­бит кон­тро­ли­ро­вать со­бы­тия в сво­ей фай­ло­вой сис­те­ме. Бла­го­да­ря Inotify он не упус­ка­ет ни еди­но­го из­ме­не­ния фай­лов.

Есть нема­ло слу­ча­ев, когда вам нуж­но бы знать, что тво­рит­ся в неком ка­та­ло­ге. Ну­ж­да – мать изо­бре­тений, и по­следние вер­сии ди­ст­ри­бу­ти­вов Linux изо­бре­ли для этой це­ли мно­же­ст­во ин­ст­ру­мен­тов. На­при­мер, ес­ли вы от­крое­те свой ка­та­лог Pictures в Dolphin при им­пор­те фо­то­гра­фий с циф­ро­вой ка­ме­ры в Digikam, но­вые фай­лы тут же ото­бра­зят­ся в окне Dolphin. Ути­ли­ты ра­бо­че­го сто­ла для по­ис­ка ис­поль­зу­ют дан­ную функ­цию для пе­ре­ин­дек­си­ро­вания из­менен­ных фай­лов – что­бы еже­ми­нут­но не сканиро­вать из­менения фай­ло­вой сис­те­мы. А ес­ли та­кая функ­ция тре­бу­ет­ся, ска­жем, в ва­ших скрип­тах обо­лоч­ки? Бла­го­да­ря мо­ду­лю яд­ра Linux по имени Inotify по­лу­чить ее не слиш­ком слож­но, что мы и до­ка­жем на дан­ном уро­ке. Мы рас­смот­рим ра­бо­ту Inotify и его воз­мож­но­сти, а так­же спо­соб лег­ко до­ба­вить его на панель ин­ст­ру­мен­тов.

Под ка­по­том

Inotify – ком­понент, обес­пе­чи­ваю­щий монито­ринг раз­лич­ных из­менений фай­лов в фай­ло­вых сис­те­мах; он вхо­дит в яд­ро Linux, на­чи­ная с вер­сии 2.6.13. Inotify по­зво­ля­ет сле­дить за одним или несколь­ки­ми фай­ла­ми или ка­та­ло­га­ми на пред­мет со­бы­тий из ука­зан­но­го на­бо­ра: от­кры­тие фай­ла или пап­ки; чте-ние, мо­ди­фи­ка­ция или из­менение ат­ри­бу­тов (на­при­мер, мет­ки или раз­ре­шения) от­кры­то­го фай­ла; за­кры­тие, пе­ре­ме­щение, соз­дание или уда­ление фай­ла. В таб­ли­це ниже все эти со­бы­тия пе­ре­чис­ле­ны.

Вы мо­же­те ис­поль­зо­вать Inotify для це­ло­го ря­да за­дач: вы­явить из­менения в фай­лах и ка­та­ло­гах (на­при­мер, в фай­ле на­строй­ки или поч­то­вом ка­та­ло­ге), ав­то­ма­ти­че­­ски восста­но­вить уда­лен­ные кри­ти­че­­ски важ­ные фай­лы на­строй­ки, от­пра­вить вам по поч­те со­об­щение, когда файл за­гру­жа­ет­ся в кон­крет­ных ка­та­ло­гах на web-сер­ве­ре, и так да­лее. Без Inotify ва­ша про­грам­ма или скрипт долж­ны бу­дут про­ве­рять фай­лы пе­рио­ди­че­­ски (та­кой об­раз дей­ст­вий на­зы­ва­ет­ся «оп­рос» [polling]) – это очень мед­лен­но и тор­мо­зит ра­бо­ту всей сис­те­мы. С Inotify яд­ро уве­дом­ля­ет про­грам­му по ка­ж­до­му ука­зан­но­му со­бы­тию. Inotify да­же мо­жет смот­реть фай­лы на съем­ных но­си­те­лях, не ме­шая вам раз­мон­ти­ро­вать диск.

От­ме­тим, что в яд­ре Linux 2.6.31, Inotify сменил­ся на Fsnotify, но по­верх Fsnotify реа­ли­зо­ван при­выч­ный ин­тер­фейс Inotify. Так что на прак­ти­ке боль­шой разницы нет: ин­ст­ру­мен­ты, ко­то­рые мы ис­поль­зу­ем на на­шем уро­ке, без про­блем ра­бо­та­ют на всех яд­рах, на­чи­ная с 2.6.13. Ес­ли вы строи­те соб­ст­вен­ное яд­ро, обес­печь­те его ком­пи­ля­цию с под­держ­кой Inotify (CONFIG_Inotify и CONFIG_INOTIFY_USER). Все основ­ные ди­ст­ри­бу­ти­вы Linux под­дер­жи­ва­ют Inotify из ко­роб­ки с ядром по умол­чанию. Ес­ли вы не уве­ре­ны, есть ли Inotify в ва­шем, про­верь­те это сле­дую­щей ко­ман­дой, ко­то­рая долж­на вы­дать по­ка­зан­ный здесь же ре­зуль­тат:

$ grep INOTIFY /boot/config-$(uname -r)
CONFIG_INOTIFY=y
CONFIG_INOTIFY_USER=y

Сле­ди­те за со­бы­тия­ми

Скорая помощь

Вы хо­ти­те быть в кур­се, ко­гда про­ис­хо­дит оп­ре­де­­лен­ное со­бы­тие? Ис­поль­зуй­те ко­ман­ды espeak, emacspeak или festival с iwatch или inoticoming.

По­сколь­ку Inotify на­хо­дит­ся в яд­ре, все про­грам­мы Linux мо­гут поль­зо­вать­ся его воз­мож­но­стя­ми без спе­ци­аль­ных биб­лио­тек. Раз­ра­бот­чик про­сто дол­жен упот­реб­лять пра­виль­ные сис­тем­ные вы­зо­вы. Но, понят­но, вам как конеч­но­му поль­зо­ва­те­лю вряд ли за­хо­чет­ся пи­сать про­грам­му на С, что­бы по­смот­реть со­бы­тия в фай­ло­вой сис­те­ме. По­это­му бы­ст­рень­ко был сфор­ми­ро­ван на­бор из двух про­стых, но мощ­ных ин­ст­ру­мен­тов команд­ной стро­ки: Inotify-tools. Боль­шин­ст­во ди­ст­ри­бу­ти­вов пред­ла­га­ют этот про­ект в фор­ме па­ке­та с тем же на­званием; или мож­но ска­чать его с сай­та http://github.com/rvoicilas/inotify-tools.

Ин­ст­ру­мен­ты из па­ке­та Inotify-toolsinotifywait и inotifywatch. Начнем со вто­ро­го: он да­ет пред­став­ление, ка­кую ин­фор­ма­цию мож­но по­лу­чить с Inotify. Про­сто вве­ди­те ко­ман­ду

$ inotifywatch -r ~

Он бу­дет ре­кур­сив­но со­би­рать ин­фор­ма­цию по всем со­бы­ти­ям фай­ло­вой сис­те­мы в ва­шем до­машнем ка­та­ло­ге.

По­ка эта ко­ман­да ра­бо­та­ет, за­пусти­те ка­кую-нибудь про­грам­му – хо­тя бы Firefox – а за­тем пре­рви­те ра­бо­ту inotifywatch с по­мо­щью Ctrl+C. Тут вы­да­ст­ся таб­ли­ца с под­сче­том всех со­бы­тий, ка­саю­щих­ся фай­лов и ка­та­ло­гов в ва­шем до­машнем ка­та­ло­ге. Это про­стой спо­соб уви­деть, к ка­ким фай­лам об­ра­ща­ет­ся Firefox и час­то ли это бы­ва­ет.

Есть и спо­соб бо­лее тон­кий: при­менить оп­цию для сбо­ра ин­фор­ма­ции по кон­крет­ным со­бы­ти­ям. Вот как по­лу­чить уве­дом­ление о соз­дании или уда­лении фай­ла в ва­шем до­машнем ка­та­ло­ге:

$ inotifywatch -e create,delete -r ~

По умол­чанию стро­ки в таб­ли­це от­сор­ти­ро­ва­ны по убы­ванию зна­чения столб­ца total, что да­ет пред­став­ление о наи­бо­лее ак­тив­ных фай­лах. Од­на­ко с по­мо­щью -d <event> мож­но от­сор­ти­ро­вать стро­ки по убы­ванию зна­чений для за­дан­но­го со­бы­тия, а -a <event> де­ла­ет то же са­мое, но по воз­рас­танию. Сор­ти­ров­ка при­менима ко всем со­бы­ти­ям, кро­ме пе­ре­ме­щения и за­кры­тия (ко­то­рые де­лят­ся на moved_to и moved_from и close_write и close_nowrite).

Вот вам еще по­лез­ные оп­ции: --exclude <pattern> и --excludei <pattern> ве­лят inotifywatch не об­ра­ба­ты­вать со­бы­тия, чьи на­звания со­от­вет­ст­ву­ют за­дан­но­му ре­гу­ляр­но­му вы­ра­жению, с уче­том ре­ги­ст­ра (--exclude) – или нечув­ст­ви­тель­но к ре­ги­ст­ру (--excludei). -t <seconds> ве­лит inotifywatch по­трудиться в те­чение ука­зан­но­го пе­рио­да вре­мени, за­тем вы­вес­ти по нему ста­ти­сти­куи за­вер­шить ра­бо­ту.

Это осо­бен­но ин­те­рес­но для неин­те­рак­тив­но­го ис­поль­зо­вания inotifywatch – на­при­мер, в сравнитель­ном тес­те.

В ре­жи­ме ре­аль­но­го вре­мени

Inotifywatch – непло­хой ин­ст­ру­мент для лю­би­те­лей ста­ти­сти­ки; ну, а ес­ли вы хо­ти­те уз­на­вать о со­бы­тии в сей же мо­мент, когда оно про­ис­хо­дит? На это в Inotify-tools име­ет­ся дру­гая про­грам­ма, inotifywait. Пусть вы хо­ти­те ре­кур­сив­но кон­тро­ли­ро­вать все со­бы­тия фай­ло­вой сис­те­мы в ва­шей до­машней ди­рек­то­рии. Вве­ди­те ко­ман­ду

$ inotifywait -mr ~

По­сле это­го за­пусти­те Firefox, по­се­ти­те па­ру сай­тов... и вы уди­ви­тесь ко­ли­че­­ст­ву фай­лов, ко­то­рые чи­тал ваш web-брау­зер.

Бла­го­да­ря оп­ции -m (монито­ринг), вы сра­зу же по­лу­чи­те из­ве­щение о лю­бом из­менении в ва­шем до­машнем ка­та­ло­ге. Ка­ж­дая стро­ка на вы­хо­де ука­зы­ва­ет ка­та­лог, со­бы­тия и (ес­ли на­до) файл. Вы так­же мо­же­те про­ве­рить это, соз­дав, а за­тем уда­лив ка­та­ло­ги и фай­лы, на­при­мер:

$ mkdir ~/testinotify
$ echo TEST > ~/testinotify/test.txt
$ touch ~/testinotify/test.txt
$ rm ~/testinotify/test.txt
$ rmdir ~/testinotify

Ни­же при­во­дит­ся ре­зуль­тат ра­бо­ты inotifywait по­сле вво­да этих ко­манд:

$ inotifywait -mr ~
Ус­та­нов­ка на­блю­де­ния. Уч­ти­те: из-за па­ра­мет­ра -r это по­тре­бу­ет вре­ме­ни!
Наб­лю­де­ние ус­та­нов­ле­но.
/home/koan/ CREATE,ISDIR testinotify
/home/koan/ OPEN,ISDIR testinotify
/home/koan/ CLOSE_NOWRITE,CLOSE,ISDIR testinotify
/home/koan/testinotify/ CREATE test.txt
/home/koan/testinotify/ OPEN test.txt
/home/koan/testinotify/ MODIFY test.txt
/home/koan/testinotify/ CLOSE_WRITE,CLOSE test.txt
/home/koan/testinotify/ OPEN test.txt
/home/koan/testinotify/ ATTRIB test.txt
/home/koan/testinotify/ CLOSE_WRITE,CLOSE test.txt
/home/koan/testinotify/ DELETE test.txt
/home/koan/ DELETE,ISDIR testinotify
/home/koan/testinotify/ DELETE_SELF

По­про­буй­те вве­сти эти ко­ман­ды в од­ном окне тер­ми­на­ла, гля­дя на ре­зуль­тат inotifywait в дру­гом окне тер­ми­на­ла ря­дом с пер­вым: это весь­ма по­учи­тель­но!

Скорая помощь

За со­бы­тия­ми мож­но на­блю­дать и в ва­ших про­грам­мах: при­вяз­ки Inotify пре­ду­смот­ре­ны для са­мых по­пу­ляр­ных про­грамм и язы­ков про­грам­ми­ро­ва­ния, в том чис­ле Perl, Python и Ruby.

Как и с inotifywatch, мож­но ис­поль­зо­вать оп­цию -e, что­бы по­лу­чить ре­зуль­тат толь­ко по кон­крет­ным со­бы­ти­ям, оп­цию -t для за­дания пе­рио­да ра­бо­ты в се­кун­дах, и --exclude или --excludei, что­бы ис­клю­чить часть фай­лов.

Так, все от­лич­но, но по­че­му эта ко­ман­да на­зы­ва­ет­ся inotifywait? Wait [ждать] в на­звании вро­де не име­ет смыс­ла? На са­мом де­ле – по умол­чанию (а не так, как мы при­ме­ня­ли ко­ман­ду до сих пор, ес­ли толь­ко вы не ука­зы­ва­ли оп­цию -m), inotifywait дей­ст­ви­тель­но ждет ука­зан­но­го со­бы­тия в фай­ло­вой сис­те­ме и за­вер­ша­ет ра­бо­ту при пер­вом по­яв­лении со­бы­тия. Это по­лез­но, когда нуж­но, что­бы ваш скрипт ожи­дал соз­дания неко­го фай­ла, а за­тем что-нибудь де­лал.

Те­перь вам, ве­ро­ят­но, за­хо­те­лось ис­поль­зо­вать inotifywait в соб­ст­вен­ных скрип­тах обо­лоч­ки. Но пре­ж­де чем на­чать пи­сать про­стран­ный скрипт, ко­то­рый ис­поль­зу­ет inotifywait, ав­то­ма­ти­че­­ски пре­об­ра­зу­ет лю­бой файл, по­сту­паю­щий в пап­ку Pictures, в миниа­тю­ру и ки­да­ет ее на web-сер­вер, да­вай­те на шаг от­сту­пим. Раз­ве неко­му бы­ло на­соз­да­вать на осно­ве Inotify скрип­тов для ба­зо­вых за­дач? Пра­виль­но: изо­бре­тать ве­ло­си­пед неза­чем. По­это­му не бу­дем на на­шем уро­ке ле­пить свои скрип­ты, но ука­жем на су­ще­ст­вую­щие ин­ст­ру­мен­ты для кон­крет­ных слу­ча­ев. Конеч­но, ес­ли ни один из них вам не под­хо­дит, или у вас ал­лер­гия на При­ду­ма­но_Не_Мной, по­че­му бы и не на­пи­сать скрип­ты са­мо­му.

Мгно­вен­ное из­ве­щение

По­лу­чи­те email, как толь­ко кто-то от­кро­ет ваш файл с па­ро­лем.

Од­на из про­грамм, по­стро­ен­ных на Inotifyiwatch (http://iwatch.sourceforge.net); она мо­жет сде­лать запись в сис­тем­ный жур­нал, вы­полнить ко­ман­ду или от­пра­вить вам элек­трон­ное пись­мо, как толь­ко про­изой­дет за­дан­ное со­бы­тие фай­ло­вой сис­те­мы. Это иде­аль­ный ин­ст­ру­мент для сис­тем­но­го ад­минист­ра­то­ра, ко­то­ро­му тре­бу­ет­ся про­стой спо­соб немед­лен­но­го уве­дом­ления при по­доз­ри­тель­ных со­бы­ти­ях в фай­ло­вой сис­те­ме. Так, на­при­мер, лег­ко сле­дить ре­кур­сив­но за из­менения­ми в /etc:

$iwatch -r  /etc

В от­ли­чие от пре­ды­ду­щих ин­ст­ру­мен­тов Inotify, по умол­чанию iwatch сле­дит толь­ко за со­бы­тия­ми close_write, create, delete, move, delete_self и move_self, что и ло­гич­но с точ­ки зрения на­зна­чения про­грам­мы: блю­сти це­ло­ст­ность ва­шей сис­те­мы. При же­лании ука­зать дру­гой на­бор со­бы­тий для на­блю­дения восполь­зуй­тесь оп­ци­ей .

Ис­клю­чения мож­но оп­ре­де­лить с по­мо­щью для пол­но­го пу­ти или с -X для ре­гу­ляр­ных вы­ра­жений. А мож­но и по-дру­го­му: ес­ли вы хо­ти­те опо­ве­щения толь­ко для от­дель­ных фай­лов или ка­та­ло­гов, ис­поль­зуй­те оп­цию -t с ре­гу­ляр­ным вы­ра­жением для фильт­ра­ции кон­тро­ли­руе­мых фай­лов. Ни­же – при­мер пре­ду­пре­ждения об из­менениях в /etc/passwd и /etc/shadow (где мы опусти­ли -r, по­то­му что /etc нам не на­до кон­тро­ли­ро­вать ре­кур­сив­но):

$ iwatch -t “passwd|shadow” /etc

До сих пор не про­смат­ри­ва­лось ниче­го та­ко­го, че­го нель­зя сде­лать в inotifywait. Но две уникаль­ные оп­ции у iwatch при­бав­ле­ны: -m для от­прав­ки уве­дом­ления по элек­трон­ной поч­те и для вы­полнения ко­ман­ды.

Пер­вый из этих ар­гу­мен­тов прост. Ес­ли вы хо­ти­те по­лу­чать уве­дом­ления по элек­трон­ной поч­те, когда кто-то по­ку­ша­ет­ся на файл в /etc, вы­полните сле­дую­щее:

$ iwatch -m your@emailaddress.com -r /etc

Конеч­но, это сра­бо­та­ет, толь­ко ес­ли ма­ши­на, где вы ее вы­пол­няе­те, име­ет поч­то­вый сер­вер, на­стро­ен­ный для от­прав­ки поч­ты на внешние хосты. В про­тив­ном слу­чае сго­дит­ся и локаль­ный поч­то­вый ящик, на­при­мер, user@host, хо­тя это ва­ри­ант, оче­вид­но, менее безо­па­сен, ес­ли вы ис­поль­зуе­те iwatch для про­вер­ки, не влез ли кто-то в ком­пь­ю­тер.

– то­же ин­те­рес­ная оп­ция. Она ука­зы­ва­ет ко­ман­ду, вы­пол­няе­мую в слу­чае ука­зан­но­го со­бы­тия; мож­но так­же ис­поль­зо­вать пе­ре­мен­ные ти­па  %f для пол­но­го пу­ти к фай­лу, вы­зы­вав­ше­му со­бы­тие, для на­звания про­грам­мы (iWatch) и %v для вы­во­да вер­сии iwatch. Вот при­мер:

$ iwatch -t “passwd|shadow” -c “logger -t ‘%p %v’ %f has been changed “ /etc

При этом ис­поль­зу­ет­ся ко­ман­да logger, ре­ги­ст­ри­рую­щая пре­ду­пре­ж­дения в жур­на­ле, когда кто-то мо­ди­фи­ци­ру­ет /etc/passwd или /etc/shadow. Вклю­чи­те свое во­об­ра­жение и по­ду­май­те, ка­кие еще ко­ман­ды вы­зы­вать в от­вет на оп­ре­де­лен­ные со­бы­тия фай­ло­вой сис­те­мы.

Дру­гая ин­те­рес­ная осо­бен­ность iwatch – ре­жим де­мо­на: при этом (с оп­ци­ей -d) iwatch вы­пол­ня­ет­ся как фо­но­вая и бе­рет кон­фи­гу­ра­цию из /etc/iwatch/iwatch.xml (или из аль­тер­на­тив­но­го фай­ла кон­фи­гу­ра­ции, ес­ли ука­зать оп­цию -f). В этом XML-фай­ле ука­жи­те спи­сок па­пок и фай­лов для монито­рин­га и ад­ре­са элек­трон­ной поч­ты для уве­дом­лений и/или ко­ман­ды для вы­полнения. Это по­лез­но, ес­ли у вас есть слож­ный ал­го­ритм для про­вер­ки: на­при­мер, вы хо­ти­те, что­бы из­менения в /var/www пе­ре­да­ва­лись web-мас­те­ру, а из­менения в /etc – сис­тем­но­му ад­минист­ра­то­ру. Сайт Iwatch – по­учи­тель­ный при­мер фай­ла XML, где iwatch ис­поль­зу­ет­ся в ре­жи­ме де­мо­на.

Inoticoming

Еще один ин­ст­ру­мент – спе­ци­аль­но для монито­рин­га по­яв­лений фай­лов в ука­зан­ном ка­та­ло­ге – inoticoming. Он при­го­дит­ся, на­при­мер, что­бы от­сле­жи­вать при­бы­тие фай­лов на FTP-сер­вер и об­ра­ба­ты­вать их по за­вер­шении за­груз­ки. Или мож­но ав­то­ма­ти­че­­ски пре­об­ра­зо­вы­вать все JPG-файлы, за­гру­жае­мые в ка­та­лог с изо­бра­жения­ми web-сер­ве­ра, в миниа­тю­ры. Ко­ман­да для этих за­дач:

$ inoticoming --initialsearch /var/www/images --suffix .jpg --chdir /var/www/images convert -resize 200 {} thumbnails/{} \;

Конеч­но, сле­ду­ет по­за­бо­тить­ся о долж­ном раз­ре­шении на запись в ка­та­ло­ге /var/www/images/thumbnails для про­цес­са inoticoming. С по­мо­щью гло­баль­ной оп­ции --initialsearch мы так­же велим inoticoming об­ра­ба­ты­вать все фай­лы в этом ка­та­ло­ге, но вы мо­же­те ее опустить, ес­ли вам это­го не тре­бу­ет­ся. За­тем мы оп­ре­де­ля­ем пап­ку /var/www/images, где ра­бо­тать (от­ме­тим, что inoticoming не бу­дет смот­реть под­ка­та­ло­ги это­го ка­та­ло­га), и на­зна­ча­ем дей­ст­вия: брать толь­ко фай­лы с рас­ши­рением .jpg и пе­ред вы­полнением ко­ман­ды пе­рей­ти в пап­ку /var/www/images. В кон­це стро­ки оп­ре­де­ле­на ко­ман­да для вы­полнения над ка­ж­дым вхо­дя­щим фай­лом – это ин­ст­ру­мент convert из па­ке­та ImageMagick.

Inoticoming ме­ня­ет пе­ре­мен­ные в скоб­ках {} на имя об­ра­ба­ты­вае­мо­го фай­ла (толь­ко имя фай­ла, без пу­ти), и ко­ман­да долж­на за­кон­чить­ся точ­кой с за­пя­той, в обо­лоч­ке эк­ранируе­мой сим­во­лом \.

В случае та­кого за­пуска inoti­coming ра­бо­та­ет как де­мон, в фо­но­вом ре­жи­ме. Гло­баль­ная оп­ция --foreground ука­зы­ва­ет оста­вать­ся на пе­реднем плане. В man-странице пе­ре­чис­ле­ны про­чие оп­ции, на­при­мер --prefix и --regexp. Inoticoming менее ги­бок, чем inotifywait, но для об­ра­бот­ки вхо­дя­щих фай­лов в од­ном ка­та­ло­ге без под­ка­та­ло­гов это удоб­ный ин­ст­ру­мент.

Дру­гие ин­ст­ру­мен­ты

Ин­ст­ру­мен­ты на ба­зе функ­ций Inotify пе­ре­чис­лен­ны­ми не ис­чер­пы­ва­ют­ся. На­при­мер, есть incron, Cron-по­доб­ный де­мон, вы­пол­няю­щий дей­ст­вия не на кон­крет­ную да­ту или вре­мя, а по ин­фор­ма­ции Inotify об оп­ре­де­лен­ном со­бы­тии. Есть так­же два ин­ст­ру­мен­та для син­хрониза­ции ка­та­ло­гов с по­мо­щью Inotify: inosync и lsyncd. Вме­сто ис­поль­зо­вания rsync в crontab для пе­рио­ди­че­­ской син­хрониза­ции двух ка­та­ло­гов ка­ж­дые Х ми­нут или ча­сов, эти ин­ст­ру­мен­ты де­ла­ют син­хрониза­цию немед­лен­но (и, бла­го­да­ря Inotify, без оп­ро­са). Ес­ли вы ре­ши­ли соз­дать са­мо­паль­ный Dropbox, один из этих ин­ст­ру­мен­тов вам по­мо­жет.

Скорая помощь

Под FreeBSD, OpenBSD, NetBSD и Mac OS X нет Inotify, но есть схо­жий ин­тер­фейс опо­ве­ще­ния о со­бы­ти­ях, Kqueue.

Но луч­ший при­знак по­пу­ляр­но­сти Inotify – то, что GNU tail (часть GNU coreutils) под­дер­жи­ва­ет Inotify на­чи­ная с вер­сии 7.5 (с ав­гу­ста 2009 го­да) при ис­поль­зо­ва­нии оп­ции -f. До это­го вам при­хо­ди­лось ис­поль­зо­вать от­дель­ный ин­ст­ру­мент, на­зы­вае­мый inotail. Вы­хо­дит, не ис­клю­че­но, что вы уже ка­кое-то вре­мя поль­зо­ва­лись Inotify, не по­доз­ре­вая о том.

Доступ­ные со­бы­тия Inotify

  • access От­крыт на­блю­дае­мый файл или файл в на­блю­дае­мом ка­та­ло­ге.
  • modify Из­менен на­блю­дае­мый файл или файл в на­блю­дае­мом ка­та­ло­ге.
  • attrib Из­менены ме­та­дан­ные на­блю­дае­мо­го фай­ла или фай­ла в на­блю­дае­мом ка­та­ло­ге. (вклю­чая мет­ки, пра­ва досту­па, рас­ши­рен­ные ат­ри­бу­ты и т. д.).
  • close_write За­крыт на­блю­дае­мый файл или файл в на­блю­дае­мом ка­та­ло­ге, от­кры­вав­ший­ся в ре­жи­ме за­пи­си.
  • close_nowrite За­крыт на­блю­дае­мый файл или файл в пре­де­лах на­блю­дае­мо­го ка­та­ло­га, от­кры­вав­ший­ся толь­ко для чтения.
  • close За­крыт на­блю­дае­мый файл или файл в на­блю­дае­мом ка­та­ло­ге. За­меть­те, что сле­жение здесь реа­ли­зо­ва­но за со­бы­тия­ми close_write или close_nowrite, по­это­му на вы­хо­де вы уви­ди­те не со­бы­тие close, а од­но из этих двух.
  • open От­крыт на­блю­дае­мый файл или файл в на­блю­дае­мом ка­та­ло­ге.
  • moved_to Файл или ка­та­лог пе­ре­ме­щен в на­блю­дае­мый ка­та­лог. Со­бы­тие про­ис­хо­дит, да­же ес­ли файл пе­ре­ме­ща­ет­ся про­сто внут­ри ка­та­ло­га (т. е. пе­ре­име­но­ван).
  • moved_from Файл или ка­та­лог пе­ре­ме­щен из на­блю­дае­мо­го ка­та­ло­га. Со­бы­тие про­ис­хо­дит, да­же ес­ли файл пе­ре­ме­ща­ет­ся про­сто внут­ри ка­та­ло­га (т. е. пе­ре­име­но­ван).
  • moved Файл или ка­та­лог пе­ре­ме­щен из на­блю­дае­мо­го ка­та­ло­га или в него. За­меть­те, что это реа­ли­зо­ва­но с по­мо­щью moved_to и moved_from, по­это­му на вы­хо­де вы уви­ди­те не со­бы­тие move, а од­но из этих двух.
  • create Соз­дан файл или ка­та­лог в на­блю­дае­мом ка­та­ло­ге.
  • delete Уда­лен файл или ка­та­лог в на­блю­дае­мом ка­та­ло­ге.
  • delete_self Файл или ка­та­лог уда­лен. По­сле это­го на­блю­дение с фай­ла или ка­та­лог снима­ет­ся. За­меть­те, что со­бы­тие мо­жет про­изой­ти, да­же ес­ли он яв­но не на­блю­дал­ся.
  • unmount От­мон­ти­ро­ва­на фай­ло­вая сис­те­ма, где на­хо­дил­ся на­блю­дае­мый файл или ка­та­лог. По­сле это­го на­блю­дение с фай­ла или ка­та­лог снима­ет­ся. За­меть­те, что со­бы­тие мо­жет про­изой­ти, да­же ес­ли он яв­но не на­блю­дал­ся.

Про­све­ти ме­ня!

Ес­ли вы ис­поль­зуе­те inotifywatch, inotifywait или дру­гой ин­ст­ру­мент Inotify на боль­шом де­ре­ве ка­та­ло­гов, на­при­мер /, вы ско­ро пре­вы­си­те стан­дарт­ный ли­мит на чис­ло про­смот­ров Inotify, по­то­му что Inotify дол­жен соз­дать один про­смотр на под­ка­та­лог. К сча­стью, эти ин­ст­ру­мен­ты вы­да­ют под­роб­ное со­об­ще­ние об ошиб­ке, и они ска­жут вам, что де­лать: уве­личь­те от­ве­ден­ное на поль­зо­ва­те­ля чис­ло про­смот­ров Inotify, ко­то­рое на­хо­дит­ся в фай­ле /proc/sys/fs/inotify/max_user_watches. Взгля­ни­те на зна­че­ние по умол­ча­нию это­го па­ра­мет­ра яд­ра и по­высь­те его, ес­ли тре­бу­ет­ся:

# cat /proc/sys/fs/inotify/max_user_watches 
8192
# echo 32768 > /proc/sys/fs/inotify/max_user_watches
# cat /proc/sys/fs/inotify/max_user_watches
32768

Те­перь на­блю­дай­те се­бе хоть за всей фай­ло­вой сис­те­мой. Од­на­ко эта на­строй­ка не пе­ре­жи­вет пе­ре­за­груз­ки ди­ст­ри­бу­ти­ва Linux. При же­ла­нии сде­лать дан­ный па­ра­метр яд­ра по­сто­ян­ным, до­бавь­те в /etc/sysctl.conf та­кую стро­ку:

fs.inotify.max_user_watches = 32768

Или, ес­ли в ва­шем ди­ст­ри­бу­ти­ве нет /etc/sysctl.conf, до­бавь­те сле­дую­щую стро­ку в /etc/rc.local, до стро­ки, со­дер­жа­щей exit 0:

echo 32768 > /proc/sys/fs/inotify/max_user_watches
Личные инструменты
  • Купить электронную версию
  • Подписаться на бумажную версию