如何在 Linux 中通过文件名记录文件系统的读/写?

如何在 Linux 中通过文件名记录文件系统的读/写?

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

我熟悉 powertop,它似乎在一定程度上有用,因为它可以显示已写入的用户文件。还有其他实用程序支持此功能吗?

我的一些发现:

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

答案1

到目前为止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

答案2

另一个选择是http://linux.die.net/man/7/inotify许多发行版都提供“inotify-tools”,因此你可以通过以下方式观察路径

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

答案3

我最近遇到了脂肪痕迹它使用通知通知。运行良好,所以我想我会分享。它确实会记录所有类型的文件操作,包括打开/创建/修改到 stdout 或可选文件,您甚至可以过滤以仅获取某些类型的操作。默认情况下,它会监视除虚拟挂载之外的所有挂载。作者本人在这里解释得很好。

答案4

#!/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"
   }

相关内容