Linuxでファイルシステムの読み取り/書き込みをファイル名で記録するにはどうすればよいですか?


17

ファイルシステムの操作を記録する簡単な方法を探しています。アクセスまたは変更されているファイルの名前を表示する必要があります。

私はpowertopに精通していますが、これはある程度機能しているように見えます。この機能をサポートする他のユーティリティはありますか。

私の発見のいくつか:

powertopを:書き込みアクセスのロギングのための最高の、より多くのCPUの活動に焦点を当てた
iotopの:プロセスによるショーリアルタイムディスク・アクセスではなく、ファイル名
のlsofショープロセスごとのオープン・ファイルではなく、リアルタイムのファイルアクセス:
iostatは:番組のリアルタイムIは、ディスク/アレイの/ Oパフォーマンス。ただし、ファイルまたはプロセスを示すものではありません。

回答:


17

これまでのところiotop、最良の全体的なソリューションです。次のコマンドは、ディスクを使用するすべてのプロセスのリアルタイム出力を提供します。

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

偶然にも、プロセスがディスクにアクセスしていることに気付くでしょう。調査する簡単な方法は、プロセスを停止し、straceで開始することです。例えば:

sudo strace -f nmbd -D

これにより、ファイルシステムアクセスのsyscallが表示されます。

別のオプションはinotify(7)で、多くのディストリビューションが「inotify-tools」を提供するため、経由でパスを見ることができます

inotifywait -r -mpath_you_want_to_watch


1
fanotifyLinuxカーネルの新しいファイルシステム通知フレームワークです(2012年頃に追加されました)。あなたはそれをチェックアウトしたいかもしれません。それを使用するツールとユーティリティはまだ書かれているので、自分で書かなければならないかもしれませんが、inotify、famin、またはこれまでに見た他のものよりもはるかに堅牢です。
-allquixotic

3
Googleでfanotifyをすばやく検索するとfatraceここから呼び出されるツールが表示されます
タンDK

何がnmbd与えられた中でstraceコマンド?
dragosrsupercool

9

別のオプションはhttp://linux.die.net/man/7/inotifyで、多くのディストリビューションが「inotify-tools」を提供しているので、経由でパスを見ることができます

inotifywait -r -m /<path you want to watch>

+1。«inotifywaitは、Linuxのinotify(7)インターフェイスを使用して、ファイルの変更を効率的に待機します。»監視されるパス内のACCESSおよびMODIFY <file>を表示することにより、きめ細かい監査を大幅に支援します。
tuk0z

3

私は最近fanotifyを使用するfatraceに出会いました。美しい作品なので、私は共有すると思いました。標準出力またはオプションでファイルを開く/作成/変更するなど、すべての種類のファイル操作をログに記録し、一部の種類の操作のみを取得するようにフィルタリングすることもできます。デフォルトでは、仮想マウントを除くすべてのマウントを監視します。著者自身がここでそれをうまく説明しています。


2

以下のためにログインする(というよりもモニタリング)あなたが使用して検討する必要があり、Linuxの監査デーモンカーネル2.6で導入されています。


あなたが見てどのようなファイルがわからない場合、私は、仕事にとても有用ではないPIDウォッチャーを取得できませんでした
cmcginty

-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"
   }

5
このコードの使用方法と、副作用と制限とともに何が達成されるかについての詳細を回答に追加してください。
ジェレミーW
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.