page header

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.