december 2009 Archieven
Inotify
Geplaatst door miekg op vr dec 4 10:00:31 CET 2009 | Permanente link | Categorie: Systeembeheer | Reacties: 0
Tijdens onze werkzaamheden bij Octrooicentrum Nederland kwam er iemand met het volgende probleem. Er was die nacht een bestand aangemaakt in een directory en hij wilde eigenlijk weten welk proces daarvoor verantwoordelijk was. Een interessante vraag en mijn eerste reactie was: "Kan niet".
Totdat ik me 's avonds bedacht dat het misschien wel kon, met het
inotify framework in Linux. Met inotify kun je je filesysteem
in de gaten houden en een seintje krijgen als er iets wordt aangemaakt,
wordt gelezen, wordt beschreven, etc.
Met man 7 inotify
lees je hoe een en ander geimplementeerd is. De bijbehorende tools kunnen met:
# apt-get install inotify-tools
geinstalleerd worden. Daarmee krijg je toegang tot de inotify API. Er
worden een tweetal tools geinstalleerd inotifywatch en inotifywait.
Inotify kan standaard maar een beperkt aantal directories in de gaten
houden. Om dat op te rekken moeten we in /proc naar een bepaalde
file een nieuwe waarde schrijven:
% sudo -s
# echo $((2 ** 16)) > /proc/sys/fs/inotify/max_user_watches
64K watches zou genoeg moeten zijn voor deze tests. Het daadwerkelijk
starten van inotifywait gaat met:
% inotifywait -m -r --format '%:e %f' ~
Setting up watches. Beware: since -r was given, this may take a while!
Watches established.
Waar
-m: blijf wachten;--format '%:e %f': iets andere output (zie de manual page)-r: recursief, bekijk alles onder~.
Nu maak ik in mijn home directory een file aan:
% touch bliep
En ik zie in mijn andere schermpje aardig wat output voorbij komen, waaronder:
CREATE bliep
OPEN bliep
ATTRIB bliep
CLOSE_WRITE:CLOSE bliep
Oftewel, er is gedetecteerd dat de file ~/bliep is aangemaakt. Verder zie
je dat touch blijkbaar de file daarna opent, de meta data verandert
(ATTRIB regel) en de file daarna sluit.
Schrijvend process ontdekken
We creeeren hier een race conditie omdat er tijd zit tussen het daadwerkelijk aanmaken van de file en het kijken met
lsof. Dus dit is niet bullet proof.
We starten onze inotifywait en wel zo dat we kijken of de file bliep
wordt gemaakt en zo ja, dan controleren we meteen of we het proces
kunnen achterhalen.
% inotifywait -m -r --format '%:e %f' ~ | grep -q 'CREATE bliep' && \
lsof -t ~/bliep | xargs pstree -a -h
Met lsof kun je achterhalen welk proces de file ~/bliep geopend
heeft, lsof print (als die iets vindt) de PID op standard output.
Deze PID vangen we op met xargs en geven we door aan pstree die de
naam van het process achterhaalt.
Dus als ik nu intussen in een andere terminal:
% touch bliep && tail -f bliep
geef, dan zal de inotifywait pipeline hierboven als output geven:
tail -f bliep
Oftewel het tail commando is nu nog bezig met de file bliep. Het
touch commando krijgen we niet te pakken want die is al lang en breed
klaar.
Inotify is een krachtig framework waar je interessante toepassingen voor kunt bedenken. En waarvan dit er een is. Een ander idee is bijvoorbeeld een on-the-fly backup toepassing.
Andere tools die gebaseerd zijn op inotify zijn onder meer:
- incron
- cron-like daemon met support voor filesysteem events
- inotail
- tail vervanger die inotify gebruikt, waarschijnlijk sneller dan de huidige GNU tail -f
Wat meer achtergrondinformatie is hier te vinden, gemaakt door de originele auteur van het framework Robert Love.
