Linux에서 파일 시스템으로 파일 시스템 읽기 / 쓰기를 어떻게 기록합니까? 작업을 기록하는 간단한 방법을 찾고 있습니다. 액세스하거나

파일 시스템 작업을 기록하는 간단한 방법을 찾고 있습니다. 액세스하거나 수정중인 파일의 이름을 표시해야합니다.

필자는 powertop에 익숙하며, 작성된 사용자 파일을 보여주기 위해 어느 정도까지 작동하는 것으로 보입니다. 이 기능을 지원하는 다른 유틸리티가 있습니까?

내 발견 중 일부 :

powertop : 쓰기 액세스 로깅에 가장 적합하지만 CPU 활동에 더 중점을 둡니다.
iotop : 프로세스별로 실시간 디스크 액세스를 표시하지만 파일 이름 은 표시 하지 않습니다.
lsof : 프로세스 당 열린 파일을 표시하지만 실시간 파일 액세스 는 표시 하지 않습니다
iostat : 실시간 I 표시 디스크 / 배열의 / O 성능이지만 파일이나 프로세스를 나타내지 않습니다



답변

지금까지 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


답변

또 다른 옵션은 http://linux.die.net/man/7/inotify입니다 . 많은 배포판에서 “inotify-tools”를 제공하므로 경로를 볼 수 있습니다

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

답변

나는 최근 fanotify 를 사용하는 fatrace를 발견했다 . 내가 아름답게 작동해서 내가 공유 할 것이라고 생각했다. stdout 또는 선택적으로 파일에 열기 / 만들기 / 수정을 포함한 모든 유형의 파일 작업을 기록하며 일부 유형의 작업 만 가져 오도록 필터링 할 수도 있습니다. 기본적으로 가상 마운트를 제외한 모든 마운트를 모니터합니다. 저자 자신이 여기서 잘 설명합니다.


답변

들어 로깅 (오히려 모니터링 이상) 당신이 사용하는 것이 좋습니다 리눅스 감사 데몬 커널 2.6에서 소개합니다.


답변

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