Как мне записать чтение / запись файловой системы по имени файла в Linux?

20964
cmcginty

Я ищу простой метод, который будет регистрировать операции файловой системы. Он должен отображать имя файла, к которому осуществляется доступ или который был изменен.

Я знаком с powertop, и кажется, что он работает до такой степени, что показывает пользовательские файлы, в которые он был записан. Есть ли другие утилиты, которые поддерживают эту функцию.

Некоторые из моих выводов:

powertop : лучше всего подходит для ведения журнала доступа к записи, но больше внимания уделяется активности процессора.
iotop : показывает доступ к диску в реальном времени по процессам, но не имя файла.
lsof : показывает открытые файлы для процесса, но не доступ к файлам в реальном времени.
iostat : показывает реальное время. / O производительность диска / массивов, но не указывает на файл или процесс

15

5 ответов на вопрос

15
cmcginty

Пока что 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», так что вы можете наблюдать путь через

inotifywait -r -mpath_you_want_to_watch

`fanotify` - это новая структура уведомлений файловой системы в ядре Linux (недавно добавленная около 2012 года). Вы можете проверить это. Инструменты и утилиты, которые его используют, все еще пишутся, так что вам, возможно, придется написать его самостоятельно, но это гораздо надежнее, чем inotify, famin или что-то еще, что вы могли видеть до сих пор. Horn OK Please 9 лет назад 1
Быстрый поиск в Google по fanotify показывает инструмент под названием `fatrace` из [здесь] (http://www.piware.de/tag/fanotify/). Thanh DK 9 лет назад 3
Что такое `nmbd` в данной команде` strace`? dragosrsupercool 7 лет назад 0
7
x29a

Другой вариант - http://linux.die.net/man/7/inotify, где многие дистрибутивы предоставляют «инструменты inotify», так что вы можете посмотреть путь через

inotifywait -r -m /<path you want to watch> 
+1. « inotifywait efficiently waits for changes to files using Linux's inotify(7) interface. » Greatly helps fine-grain auditing by showing off any ACCESS and MODIFY in the path monitored. tuk0z 5 лет назад 0
2
RedGrittyBrick

Для ведения журнала (а не мониторинга) вы должны рассмотреть возможность использования демона аудита Linux, представленного в ядре 2.6.

Я не смог заставить работать PID наблюдатель, поэтому не очень полезен, если вы не знаете, какой файл смотреть cmcginty 11 лет назад 0
2
turbofan

I recently came across fatrace which uses fanotify. Works beautiful so I figured I would share. It does log all types of file operations including open/create/modify to stdout or optionally a file and you can even filter as to get only some types of operations. By default it monitors all mounts except the virtual ones. The author himself explains it well here.

-3
Jon
#!/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)  my $mydir = getcwd; my ($fh, $tmpfile) = tempfile(UNLINK => 1);  while(1) { my $starttime = time; eval { local $SIG = 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++) ."\t".$sorted[$x]."\n";} my $endtime = time; my $length = ($endtime-$starttime); if ($length > 0.3)  print "\n$length"."s\n" } 
Не могли бы вы обновить свой ответ некоторыми подробностями о том, как использовать этот код и что он будет достигать наряду с побочными эффектами и ограничениями? Jeremy W 10 лет назад 5

Похожие вопросы