Wie protokolliere ich das Lesen / Schreiben von Dateisystemen nach Dateinamen unter Linux?

17

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

Ich kenne powertop und es scheint, dass dies in einem solchen Ausmaß funktioniert, dass es die Benutzerdateien anzeigt, in die geschrieben wurde. Gibt es andere Dienstprogramme, die diese Funktion unterstützen?

Einige meiner Erkenntnisse:

powertop : am besten für den Schreibzugriff Protokollierung, aber mehr konzentrierte sich auf die CPU - Aktivität
iotop : zeigt Echtzeit - Festplattenzugriff durch den Prozess, aber nicht Dateinamen
lsof : zeigt die offenen Dateien pro Prozess, aber nicht in Echtzeit Dateizugriff
iostat : zeigt die Echtzeit - I / O-Leistung von Datenträgern / Arrays, zeigt jedoch weder Datei noch Prozess an

cmcginty
quelle

Antworten:

17

Bisher iotopist die beste Gesamtlösung. Mit dem folgenden Befehl erhalten Sie eine Echtzeitausgabe aller Prozesse, die den Datenträger verwenden.

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

Trotzdem werden Sie feststellen, dass der Prozess auf die Festplatte zugreift. Die einfache Möglichkeit, dies zu untersuchen, besteht darin, den Prozess anzuhalten und mit Spannung zu beginnen. Beispielsweise:

sudo strace -f nmbd -D

Dies zeigt Ihnen Systemaufrufe des Dateisystemzugriffs.

Eine andere Option ist inotify (7) , wo viele Distributionen "inotify-tools" bereitstellen, über die Sie einen Pfad verfolgen können

inotifywait -r -mpath_you_want_to_watch

cmcginty
quelle
1
fanotifyist ein neues Dateisystem-Benachrichtigungsframework im Linux-Kernel (kürzlich um 2012 hinzugefügt). Vielleicht möchten Sie das überprüfen. Tools und Dienstprogramme, die es verwenden, werden noch geschrieben, daher müssen Sie möglicherweise eines selbst schreiben, aber es ist viel robuster als inotify, famin oder alles andere, was Sie bisher gesehen haben.
allquixotic
3
Eine schnelle Google-Suche nach fanotify zeigt ein Tool, das fatracevon hier aufgerufen wird .
Thanh DK
Was ist nmbdin dem gegebenen straceBefehl?
Dragosrsupercool
9

Eine andere Option ist http://linux.die.net/man/7/inotify, wo viele Distributionen "inotify-tools" bereitstellen, über die Sie einen Pfad anzeigen können

inotifywait -r -m /<path you want to watch>
x29a
quelle
+1. «Inotifywait wartet mithilfe der inotify (7) -Schnittstelle von Linux effizient auf Änderungen an Dateien. »Hilft bei der Feinkörnigkeitsprüfung, indem ACCESS und MODIFY <file> im überwachten Pfad angezeigt werden.
Tuk0z
3

Ich bin kürzlich auf fatrace gestoßen , das fanotify verwendet . Funktioniert wunderbar, also dachte ich mir, ich würde teilen. Es werden alle Arten von Dateivorgängen protokolliert, einschließlich Öffnen / Erstellen / Ändern in stdout oder optional eine Datei, und Sie können sogar filtern, um nur einige Arten von Vorgängen abzurufen. Standardmäßig werden alle Halterungen mit Ausnahme der virtuellen überwacht. Der Autor selbst erklärt es hier gut.

Turbofan
quelle
2

Zum Protokollieren (anstatt zum Überwachen) sollten Sie den in Kernel 2.6 eingeführten Linux- Überwachungsdämon verwenden .

RedGrittyBrick
quelle
Ich konnte den PID-Beobachter nicht zum
Laufen bringen
-3
#!/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) {print "please increase window size"; exit; }
my $mydir = getcwd;
my  ($fh, $tmpfile) = tempfile(UNLINK => 1);

while(1)
   {
   my $starttime = time;
   eval {
        local $SIG{ALRM} = 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++) {print $filecount{$sorted[$x]}."\t".$sorted[$x]."\n";}
   my $endtime = time;
   my $length = ($endtime-$starttime);
   if ($length > 0.3) {print "program not designed for large trees, please use smaller tree.\n"; exit;}
   print "\n$length"."s\n"
   }
Jon
quelle
5
Könnten Sie bitte Ihre Antwort mit einigen Details zur Verwendung dieses Codes aktualisieren und was er zusammen mit Nebenwirkungen und Einschränkungen bewirken wird?
Jeremy W