Come posso registrare / leggere il file system in base al nome file in Linux?


17

Sto cercando un metodo semplice per registrare le operazioni del file system. Dovrebbe visualizzare il nome del file a cui si accede o che è stato modificato.

Ho familiarità con powertop e sembra che funzioni in misura tale da mostrare i file dell'utente su cui sono stati scritti. Esistono altre utilità che supportano questa funzione?

Alcuni dei miei risultati:

powertop : migliore per la registrazione dell'accesso in scrittura, ma più focalizzato sull'attività della CPU
iotop : mostra l'accesso al disco in tempo reale per processo, ma non il nome del file
lsof : mostra i file aperti per processo, ma non
iostat di accesso ai file in tempo reale : mostra il tempo reale I / O prestazioni del disco / array ma non indica file o processo

Risposte:


17

Finora iotopè la migliore soluzione globale. Il seguente comando fornisce un output in tempo reale di tutti i processi che utilizzano il disco.

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

Evenutaly noterai che il processo accederà al disco. Il modo più semplice per indagare è interrompere il processo e avviarlo con una sequenza. Per esempio:

sudo strace -f nmbd -D

Questo ti mostrerà syscalls dell'accesso al file system.

Un'altra opzione è inotify (7) , in cui molte distribuzioni forniscono "inotify-tools" in modo da poter guardare un percorso tramite

inotifywait -r -mpath_you_want_to_watch


1
fanotifyè un nuovo framework di notifica del filesystem nel kernel Linux (recentemente aggiunto intorno al 2012). Potresti voler dare un'occhiata. Gli strumenti e le utilità che lo usano sono ancora in fase di scrittura, quindi potresti doverne scrivere uno tu stesso, ma è molto più robusto di inotify, fame o qualsiasi altra cosa che potresti aver visto finora.
allquixotic,

3
Una rapida ricerca su Google per fanotify mostra uno strumento chiamato fatraceda qui .
Thanh DK,

Cosa c'è nmbdnel stracecomando dato ?
dragosrsupercool,

9

Un'altra opzione è http://linux.die.net/man/7/inotify dove molte distribuzioni forniscono "inotify-tools" in modo da poter guardare un percorso tramite

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

+1. «Inotify attende in modo efficiente le modifiche ai file utilizzando l'interfaccia inotify (7) di Linux. »Aiuta notevolmente l'auditing a grana fine mostrando qualsiasi ACCESS e MODIFICA <file> nel percorso monitorato.
tuk0z,

3

Di recente mi sono imbattuto in Fatrace che usa Fanotify . Funziona magnificamente, quindi ho pensato di condividere. Registra tutti i tipi di operazioni sui file tra cui apri / crea / modifica su stdout o facoltativamente un file e puoi persino filtrare in modo da ottenere solo alcuni tipi di operazioni. Per impostazione predefinita monitora tutti i montaggi tranne quelli virtuali. L'autore stesso lo spiega bene qui.


2

Per la registrazione (piuttosto che il monitoraggio) dovresti considerare di usare il demone di controllo Linux introdotto nel kernel 2.6.


Non sono riuscito a far funzionare il watcher PID, quindi non molto utile se non sai quale file guardare
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
potresti aggiornare la tua risposta con alcuni dettagli su come utilizzare questo codice e cosa comporterà insieme agli effetti collaterali e alle limitazioni?
Jeremy W,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.