如何在Linux中按文件名记录文件系统读/写操作?


17

我正在寻找一种记录文件系统操作的简单方法。它应该显示正在访问或修改的文件的名称。

我对powertop很熟悉,而且看起来在某种程度上可以奏效,它可以显示写入的用户文件。是否有其他实用程序支持此功能。

我的一些发现:

powertop:最适合写访问日志记录,但更着重于CPU活动
iotop:按进程显示实时磁盘访问,但不显示文件名
lsof:显示每个进程打开的文件,但不实时显示文件
iostat:显示实时I磁盘/阵列的/ O性能,但不表示文件或进程

Answers:


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

这将向您显示文件系统访问的系统调用。

另一个选项是inotify(7),其中许多发行版都提供“ inotify-tools”,因此您可以通过以下方式查看路径

inotifywait -r -mpath_you_want_to_watch


1
fanotify是Linux内核中的新文件系统通知框架(最近于2012年添加)。您可能要检查一下。使用它的工具和实用程序仍在编写中,因此您可能必须自己编写一个,但它比inotify,famin或到目前为止可能看到的任何其他功能都健壮。
allquixotic

3
Google对fanotify的快速搜索显示了一个fatrace此处调用的工具。
Thanh DK

什么是nmbd在给定的strace命令?
dragosrsupercool 2014年

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

最近,我碰上了fatrace它采用fanotify。作品漂亮,所以我想我会分享。它确实记录了所有类型的文件操作,包括打开/创建/修改为stdout或可选的文件,您甚至可以过滤为仅获得某些类型的操作。默认情况下,它监视除虚拟安装以外的所有安装。作者本人在这里对此做了很好的解释。



-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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.