it-swarm.it

Come determinare quale processo sta creando un file?

Dato il percorso del file, come posso determinare quale processo lo crea (e/o legge/scrive su di esso)?

67
Anton Barkovsky

Il comando lsof (già menzionato in diverse risposte) ti dirà quale processo ha un file aperto nel momento in cui lo esegui . lsof è disponibile per quasi tutte le varianti di unix.

lsof /path/to/file

lsof non ti parlerà del file che è stato aperto due microsecondi fa e chiuso un microsecondo fa. Se è necessario guardare un determinato file e reagire quando vi si accede, sono necessari strumenti diversi.

Se puoi pianificare un po 'in anticipo, puoi mettere il file su un LoggedFS filesystem. LoggedFS è un file system Fuse impilato che registra tutti gli accessi ai file in una gerarchia. I parametri di registrazione sono altamente configurabili. Il fusibile è disponibile su tutti i principali unices . Ti consigliamo di registrare gli accessi alla directory in cui viene creato il file. Inizia con il file di configurazione di esempio fornito e modificalo secondo questa guida .

loggedfs -l /path/to/log_file -c /path/to/config.xml /path/to/directory
tail -f /path/to/log_file

Molti uffici offrono altre funzionalità di monitoraggio. Sotto Linux, è possibile utilizzare il relativamente nuovo sottosistema di controllo . Non c'è molta letteratura a riguardo (ma più che sui log registrati); puoi iniziare con questo tutorial o apochiesempi o semplicemente con auditctl man page . Qui, dovrebbe essere sufficiente assicurarsi che il demone sia avviato, quindi eseguire auditctl:

auditctl -w /path/to/file

(Penso che i sistemi più vecchi abbiano bisogno di auditctl -a exit,always -w /path/to/file) e guarda i log in /var/log/audit/audit.log.

Bene, potresti eseguire ripetutamente lsof, e se sei fortunato il colpevole manterrà il file aperto abbastanza a lungo da mostrarlo. ie .:

$ lsof -r1 /path/to/file

o per molti file

$ lsof -r1 /path/to/folder/*

Questo elencherà tutti gli accessi al percorso specificato in un determinato momento, una volta al secondo. Ciò include l'elenco del PID del processo che accede al file.

Se non funziona, ovvero, il file viene aperto e chiuso molto rapidamente, come spesso accade, credo che sia necessario cercare strumenti più elaborati. Forse loggfs potrebbe essere qualcosa?

Hackland
Se il lsof una volta al secondo non funziona, puoi ovviamente hackerare un ciclo while che esegue lsof ripetutamente il più velocemente possibile. Piace:

$ while true; do lsof /paht/to/file; done;

Non carino, ma chi lo sa, potrebbe semplicemente farlo.

11
0scar

Puoi usare lsof per questo:

$ lsof /tmp/file
COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
less      4737 wena    4r   REG    8,6    90700 1643536 /tmp/file

Dice che il processo chiamato less è mantenere aperto il file "/ tmp/file".

NOTE : Stranamente, non funziona se uso geany o nano. Non vedo l'ora di suggerimenti migliori.

1
tshepang

Puoi usare ls e grep per scoprire i file usati da Chrome

$ ls -l /proc/*/fd | grep "chrome"
lrwx------ 1 ba abc 64 Jul 16 22:19 104 -> /home/abc/.config/google-chrome/Default/Cookies
lr-x------ 1 abc abc 64 Jul 16 22:19 113 -> /opt/google/chrome/nacl_irt_x86_64.nexe
lrwx------ 1 abc abc 64 Jul 16 22:19 121 -> /home/abc/.cache/google-chrome/Default/Cache/data_0
lrwx------ 1 abc abc 64 Jul 16 22:19 122 -> /home/abc/.cache/google-chrome/Default/Cache/data_1
lrwx------ 1 abc abc 64 Jul 16 22:19 123 -> /home/abc/.cache/google-chrome/Default/Cache/data_2
lr-x------ 1 abc abc 64 Jul 16 22:19 125 -> /home/abc/.config/google-chrome/Dictionaries/en-US-3-0.bdic

Un altro modo è usare lsof e grep

$ lsof | grep "chrome"
chrome     2204       abc  cwd       DIR                8,5     4096 1441794 /home/abc
chrome     2204       abc  rtd       DIR                8,5     4096       2 /
chrome     2204       abc  txt       REG                8,5 87345336 5111885 /opt/google/chrome/chrome
chrome     2204       abc  mem       REG                8,5  4202496 1443927 /home/abc/.cache/google-chrome/Default/Media Cache/data_3
chrome     2204       abc  mem       REG                8,5  1056768 1443926 /home/abc/.cache/google-chrome/Default/Media Cache/data_2
chrome     2204       abc  mem       REG                8,5   270336 1443925 /home/abc/.cache/google-chrome/Default/Media Cache/data_1
chrome     2204       abc  mem       REG                8,5    45056 1443924 /home/abc/.cache/google-chrome/Default/Media Cache/data_0
0
SRINIVAS KATLA
lsof |grep (filename)

Questo ti mostrerà il processo che sta attualmente utilizzando il file.

0
Matthew