Wie protokolliere ich Dateisystem-Lese- / Schreibvorgänge nach Dateiname in Linux?

21357
cmcginty

Ich suche nach einer einfachen Methode, die Dateisystemvorgänge protokolliert. Es sollte den Namen der Datei anzeigen, auf die zugegriffen wird oder die geändert wird.

Ich bin mit Powertop vertraut, und es scheint, dass dies so funktioniert, dass es die Benutzerdateien anzeigt, in die geschrieben wurden. Gibt es andere Dienstprogramme, die diese Funktion unterstützen?

Einige meiner Erkenntnisse:

powertop : am besten für den Schreibzugriff Protokollierung, sondern mehr auf die CPU - Aktivität
iotop : zeigt Echtzeit - Festplattenzugriff durch den Prozess, aber nicht Dateinamen
lsof : zeigt die geöffneten Dateien pro Prozess, aber nicht in Echtzeit Dateizugriff
iostat : zeigt die Echtzeit I / O Leistung von Festplatten / Arrays, gibt jedoch keine Datei oder einen Prozess an

15

5 Antworten auf die Frage

15
cmcginty

Bisher iotopist die beste Gesamtlösung. Mit dem folgenden Befehl können Sie alle Prozesse, die die Festplatte verwenden, in Echtzeit ausgeben.

iotop -bktoqqq -d .5  where: -b is batch mode -k is kilobytes/s -t adds timestamp -o only show processes or threads actually doing I/O -qqq removes output headers -d .5 updates every .5 seconds 

Selbst wenn Sie feststellen, wird der Prozess auf die Festplatte zugreifen. Der einfache Weg zur Untersuchung besteht darin, den Prozess zu stoppen und ihn mit strace zu starten. Zum Beispiel:

sudo strace -f nmbd -D 

Dadurch werden Ihnen Systemaufrufe des Dateisystemzugriffs angezeigt.

Eine weitere Option ist inotify (7), bei der viele Distributionen "inotify-tools" zur Verfügung stellen, über die Sie einen Pfad über beobachten können

inotifywait -r -mpath_you_want_to_watch

"fanotify" ist ein neues Dateisystem-Benachrichtigungs-Framework im Linux-Kernel (kürzlich hinzugefügt um 2012). Vielleicht möchten Sie das überprüfen. Werkzeuge und Hilfsprogramme, die es verwenden, werden noch geschrieben. Sie müssen möglicherweise selbst eines schreiben, aber es ist viel robuster als Inotify, Famin oder alles, was Sie bisher gesehen haben. Horn OK Please vor 11 Jahren 1
Eine schnelle Google-Suche nach fanotify zeigt ein Tool namens "fatrace" von [hier] (http://www.piware.de/tag/fanotify/). Thanh DK vor 10 Jahren 3
Was ist "nmbd" im gegebenen Befehl "strace"? dragosrsupercool vor 9 Jahren 0
7
x29a

Another option is http://linux.die.net/man/7/inotify where many distributions provide "inotify-tools" so you can watch a path via

inotifywait -r -m /<path you want to watch> 
+1. «Inotifywait wartet effizient auf Änderungen an Dateien über die inotify (7) - Schnittstelle von Linux. »Ermöglicht die Feinabstimmung von Audits, indem jeder Zugriff und jede Änderung angezeigt wird im Pfad überwacht. tuk0z vor 7 Jahren 0
2
RedGrittyBrick

Für die Protokollierung (und nicht für die Überwachung) sollten Sie den in Kernel 2.6 eingeführten Linux-Audit-Daemon in Betracht ziehen .

Ich konnte den PID-Watcher nicht zum Laufen bringen, also nicht sehr nützlich, wenn Sie nicht wissen, welche Datei Sie ansehen sollen cmcginty vor 13 Jahren 0
2
turbofan

Ich bin kürzlich auf Fatrace gestoßen, die fanotify verwendet . Funktioniert schön, also dachte ich, ich würde es teilen. Es protokolliert alle Arten von Dateioperationen, einschließlich Öffnen / Erstellen / Ändern in stdout oder optional eine Datei. Sie können sogar filtern, um nur einige Arten von Operationen zu erhalten. Standardmäßig werden alle Mounts mit Ausnahme der virtuellen Monitore überwacht. Der Autor selbst erklärt es hier gut.

-3
Jon
#!/usr/bin/perl use Cwd; use File::Touch; use File::Temp qw/tempfile/; use Time::HiRes qw/sleep time alarm/; use Term::ReadKey; my ($wchar, $hchar, $wpixels, $hpixels) = GetTerminalSize(); if($hchar < 10)  my $mydir = getcwd; my ($fh, $tmpfile) = tempfile(UNLINK => 1);  while(1) { my $starttime = time; eval { local $SIG = sub { die "alarm\n" }; alarm 0.4; $query = `find -neweraa $tmpfile 2>&1`; #change to mm for writes only touch($tmpfile); @files = split(/\n/,$query); alarm 0; }; system('clear'); foreach $file(@files) { $filecount{$file}++; } @sorted = sort {$filecount{$b} <=> $filecount{$a}} (keys %filecount); for ($x = 0;$x < $hchar-2; $x++) ."\t".$sorted[$x]."\n";} my $endtime = time; my $length = ($endtime-$starttime); if ($length > 0.3)  print "\n$length"."s\n" } 
Könnten Sie bitte Ihre Antwort mit einigen Details zur Verwendung dieses Codes und dessen Auswirkungen sowie Nebenwirkungen und Einschränkungen aktualisieren? Jeremy W vor 11 Jahren 5