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átor | Obsah |
---|---|
wd | popisovač sledování |
mask | maska událostí |
cookie | hodnota použitá k synchronizaci dvojice událostí IN_MOVED_FROM a IN_MOVED_TO |
len | délka řetězce s názvem |
name | ná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
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.