Bagaimana cara saya log sistem baca / tulis dengan nama file di Linux?

17

Saya mencari metode sederhana yang akan mencatat operasi sistem file. Seharusnya menampilkan nama file yang sedang diakses atau dimodifikasi.

Saya kenal dengan powertop, dan tampaknya ini berfungsi sampai batas tertentu, sedemikian rupa sehingga memperlihatkan file pengguna yang ditulis. Apakah ada utilitas lain yang mendukung fitur ini.

Beberapa temuan saya:

powertop : terbaik untuk logging akses tulis, tetapi lebih fokus pada aktivitas CPU
iotop : menunjukkan akses disk waktu nyata menurut proses, tetapi bukan nama file
lsof : menunjukkan file yang terbuka per proses, tetapi bukan akses file waktu nyata
iostat : menunjukkan waktu nyata saya / O kinerja disk / array tetapi tidak menunjukkan file atau proses

cmcginty
sumber

Jawaban:

17

Sejauh ini iotopadalah solusi keseluruhan terbaik. Perintah berikut memberi Anda output waktu nyata dari semua proses menggunakan disk.

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

Bahkan Anda akan melihat bahwa proses akan mengakses disk. Cara sederhana untuk menyelidiki adalah menghentikan proses, dan mulai dengan strace. Sebagai contoh:

sudo strace -f nmbd -D

Ini akan menunjukkan Anda syscalls dari akses sistem file.

Pilihan lain adalah inotify (7) , di mana banyak distribusi menyediakan "inotify-tools" sehingga Anda dapat menonton jalan melalui

inotifywait -r -mpath_you_want_to_watch

cmcginty
sumber
1
fanotifyadalah kerangka pemberitahuan sistem file baru di kernel Linux (baru-baru ini ditambahkan sekitar 2012). Anda mungkin ingin memeriksanya. Alat dan utilitas yang menggunakannya masih sedang ditulis, jadi Anda mungkin harus menulisnya sendiri, tetapi jauh lebih kuat daripada memberitahukan, famin, atau apa pun yang Anda mungkin telah melihat sejauh ini.
allquixotic
3
Pencarian Google cepat untuk fanotify menunjukkan alat yang dipanggil fatracedari sini .
Thanh DK
Apa yang ada nmbddalam straceperintah yang diberikan ?
dragosrsupercool
9

Opsi lain adalah http://linux.die.net/man/7/inotify di mana banyak distribusi menyediakan "inotify-tools" sehingga Anda dapat menonton lintasan melalui

inotifywait -r -m /<path you want to watch>
x29a
sumber
+1. «Inotifywait secara efisien menunggu perubahan pada file yang menggunakan antarmuka (7) inotify Linux. »Sangat membantu audit fine-grain dengan memamerkan ACCESS dan MODIFY <file> apa pun di jalur yang dipantau.
tuk0z
3

Baru-baru ini saya menemukan fatrace yang menggunakan fanotify . Pekerjaannya indah jadi saya pikir saya akan berbagi. Itu log semua jenis operasi file termasuk buka / buat / modifikasi ke stdout atau file opsional dan Anda bahkan dapat memfilter untuk mendapatkan hanya beberapa jenis operasi. Secara default memonitor semua mount kecuali yang virtual. Penulis sendiri menjelaskannya dengan baik di sini.

turbofan
sumber
2

Untuk mencatat (daripada memonitor) Anda harus mempertimbangkan untuk menggunakan daemon audit Linux yang diperkenalkan di kernel 2.6.

RedGrittyBrick
sumber
Saya tidak bisa membuat pengamat PID bekerja, jadi tidak terlalu berguna jika Anda tidak tahu file apa yang harus ditonton
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"
   }
Jon
sumber
5
dapatkah Anda memperbarui jawaban Anda dengan beberapa perincian tentang bagaimana menggunakan kode ini dan apa yang akan dicapai bersama dengan efek samping dan batasan?
Jeremy W