inotify

inotify je subsystém linuxového jádra, který poskytuje notifikaci o událostech v souborovém systému. Jeho autory jsou Robert Love a John McCutchan a vznikl proto, aby nahradil dnotify. Subsystém byl přidán do hlavního stromu jádra ve verzi 2.6.13, lze ho zakompilovat do verze 2.6.12 a možná i do dřívějších verzí pomocí patche. Jeho funkcí je v zásadě rozšíření souborových systémů tak, aby zachycovaly události na souborech a tyto změny byly předávány aplikacím.

Největší oblastí použití jsou tedy zřejmě utility pro desktopové hledání, jako je Beagle, protože funkcionalita inotify umožňuje přeindexovávat změny v souborech, aniž by se musel často procházet celý souborový systém, což by bylo velmi neefektivní. Protože se Beagle apod. o změně dozví na základě oznámení, nikoli aktivního procházení, může k přeindexování dojít velmi rychle (v řádu jedné sekundy) a s velmi malou režií. inotify tak umožňuje používat tyto programy velmi citlivě z hlediska celého systému – distributoři obecně nepřijímají démony, které by k poskytnutí určité funkcionality spotřebovávaly značnou část výkonu systému.

inotify lze použít také k automatickým aktualizacím pohledů na adresáře, načítání konfiguračních souborů, záznamu změn, zálohování, synchronizaci, uploadu apod.

Výhody

inotify má oproti technologii dnotify (kterou nahrazuje) mnoho výhod. U dnotify musel program používat pro každý sledovaný adresář jeden souborový popisovač (file descriptor). To se může stát úzkým hrdlem, protože počet popisovačů na proces je omezený. Další problém nastával s výměnnými médii. Protože byly při sledování na souborovém systému otevřeny popisovače, nešel tento souborový systém odpojit a médium vyjmout.

Podstatnou nevýhodou dnotify je také granularita – umožňuje totiž monitorovat pouze adresáře a navíc není k dispozici žádná bližší informace o události. Programátoři aplikací tedy musí uchovávat strukturu stat, po každé události načíst nová data a porovnat je s těmi uloženými.

inotify používá jednoduché a elegantní API, které skrze malý počet souborových popisovačů umožňuje programátorům používat rozhraní select() nebo poll(), což je mnohem komfortnější v porovnání se signálovým notifikačním systémem používaným dnotify. To také činí integraci s knihovnami založenými na těchto voláních (například GLib) mnohem snazší. Výhodou je také jemnější granularita – inotify má rozhraní založené na i-node.

Jak to funguje

inotify se používá prostřednictvím sady systémových volání vytvořených speciálně pro inotify.

int inotify_init ()

Vytvoří instanci inotify. Vrací souborový popisovač, ze kterého se budou číst veškeré události.

int inotify_add_watch (int fd, const char* pathname, int mask)

Zahájí sledování i-node identifikovaného zadanou cestou. Budou se sledovat události definované v masce. Vrací (v rámci instance unikátní) popisovač sledování určitého i-node (Poznámka: Na stejný i-node, a tedy stejný popisovač sledování, může ukazovat více souborových cest).

int inotify_rm_watch (int fd, int wd)

Zruší sledování podle daného popisovače.

Události generované subsystémem inotify obsahují tyto informace:

IdentifikátorObsah
wdpopisovač sledování
maskmaska událostí
cookiehodnota použitá k synchronizaci dvojice událostí IN_MOVED_FROM a IN_MOVED_TO
lendélka řetězce s názvem
namenázev souboru, na kterém nastala událost (při sledování adresáře)

Toto jsou některé z událostí, které lze sledovat:

  • IN_ACCESS – čtení souboru
  • IN_MODIFY – změna souboru
  • IN_ATTRIB – změna atributů souboru
  • IN_OPEN a IN_CLOSE – otevření, resp. zavření souboru
  • IN_MOVED_FROM a IN_MOVED_TO – přesun souboru
  • IN_DELETE – smazání souboru (ve sledovaném adresáři)
  • IN_CREATE – vytvoření souboru (ve sledovaném adresáři)
  • IN_DELETE_SELF – smazání sledovaného souboru

Historie


Externí odkazy

  • inotify-tools Sada uživatelských utilit založených na inotify – umožňují sledovat a zaznamenávat změny souborů a adresářů
  • Pyinotify inotify rozhraní pro jazyk Python
  • Official inotify README
  • Kernel Korner – Intro to inotify by Robert Love (2005, anglicky)
  • LWN Article on Inotify Watching filesystem events with inotify (anglicky, částečně zastaralé)
  • IBM Article Monitor Linux file system events with inotify (anglicky, zastaralý článek)
  • JNotify „Java knihovna, která umožňuje aplikacím v jazyce Java poslouchat události v souborovém systému.“
  • inotify-cxx C++ rozhraní k inotify.
  • incron Systém inotify cron. Pracuje jako normální cron, ale ke spouštění úloh místo časových period používá události v souborovém systému.