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 년경에 추가됨). 당신은 그것을 확인하고 싶을 수도 있습니다. 이 도구를 사용하는 도구와 유틸리티는 여전히 작성 중이므로 직접 작성해야 할 수도 있지만, 지금까지 보지 못했던 것보다 더 강력하거나 명료 한 것보다 훨씬 강력합니다.
allquixotic

3
fanotify에 대한 빠른 Google 검색 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

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


2

들어 로깅 (오히려 모니터링 이상) 당신이 사용하는 것이 좋습니다 리눅스 감사 데몬 커널 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
이 코드를 사용하는 방법과 부작용 및 제한 사항과 함께 달성 할 수있는 방법에 대한 세부 정보로 답변을 업데이트 할 수 있습니까?
Jeremy W
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.