Portál AbcLinuxu, 2. května 2025 20:32
Když jsem před časem psal o inotify-cxx, objevil se v diskusi nápad na vytvoření démona, který by fungoval jako cron, ale reagoval by na události ve filesystému. Trochu jsem o tom zauvažoval, a došlo mi, jak dobrá věc by to byla, se spoustou možností využití. Proto jsem po volných chvilkách zbastlil něco, co by mohlo příslušné požadavky plnit.
inotify je dobrá věc, to je jasné. Je ovšem škoda, že se zatím používá jen zřídka, i když už je v jádře docela dlouho. Sledovat události v souborovém systému se může hodit z celé řady důvodů. Proto se zcela logicky objevila poptávka po programu, který by se pověsil na určitá místa (adresáře, soubory) a na základě událostí volal další programy nebo skripty.
Když se tehdy taková věc objevila v diskusi, nejprve jsem to poněkud zavrhl. Protože se ale ukázalo, k čemu všemu se takový program hodí, rozhodl jsem se něco takového napsat. Je to šité pořádně horkou jehlou, proto je jasné, že o chyby nebude nouze. Již nyní vím o řadě z nich (včetně nechutných prasáren, jako je volání wait() v handleru signálu SIGCHLD), ale bude jich určitě mnohem víc.
Celý systém je navržen tak, aby se používal podobně jako obyčejný cron. Má tedy dvě části - démona (incrond) a manipulační program (incrontab). Démon se spustí (pod rootem, např. z init skriptu), načte tabulky uživatelů a pověsí se na adresář s tabulkami - změny v tabulkách se tedy projeví okamžitě.
Manipulační program se používá prakticky stejně jako jeho vzor, program crontab. Lze vypsat tabulku, smazat ji, editovat (oblíbeným editorem podle proměnné EDITOR) nebo importovat ze souboru. Argumenty programu a další věci okolo toho se prakticky neliší od programu crontab.
Tabulka obsahuje řádky pro jednotlivé sledované cesty. Řádek vypadá takto:
<cesta> <maska> <příkaz>
Cesta může být libovolná ve filesystému, ale s mezerami apod. si program zatím neporadí. Masku lze zadat buď číselně, nebo lépe přímo symbolicky (symboly oddělené čárkou) podle headeru inotify.h. Příkaz může být binárka nebo skript, s absolutní cestou i bez ní (použije se PATH). Nemůže obsahovat přesměrování, roury ani nic podobného, zato lze ale používat speciální symboly. $@ znamená cestu zadanou na začátku řádku, $# název souboru, kde došlo k události, a $$ je pro samotný znak dolaru. Může to pak vypadat následovně:
/var/mail IN_CLOSE_WRITE,IN_MOVED_TO my_notify $#
Uvedený příklad bude sledovat adresář /var/mail
, a když někdo zapíše do souboru v adresáři, nebo tam přesune soubor odjinud, spustí se program my_notify
s názvem souboru jako argumentem. Jak prosté...
Kdo má zájem program použít, nechť stahuje. Budu velice vděčný za každou připomínku nebo námět. Také bych ocenil, kdyby se nějaký znalec na bezpečnost podíval na program i z tohoto pohledu - žonglování s efektivními právy a další podobné lahůdky nejsou mojí parketou. Program je založen na rozhraní inotify-cxx, který se současně posunulo do verze 0.2.0.
Než skončím, ještě pro informaci připomenu několik možností použití této hračky:
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.