Come scoprire quale file è attualmente scritto da un processo


9

La mia situazione è che di volta in volta un processo specifico (in questo caso, è Thunderbird) non reagisce all'input dell'utente per circa un minuto. Ho scoperto iotopche durante questo periodo scrive molto sul disco, e ora voglio scoprire su quale file scrive, ma purtroppo iotopfornisce solo statistiche per processo e non per file aperto (-descriptor).

So che posso usare lsofper scoprire quali file il processo ha attualmente aperto, ma ovviamente Thunderbird ne ha aperti molti, quindi non è molto utile. iostatmostra solo le statistiche per dispositivo.

Il problema si verifica solo in modo casuale e potrebbe volerci un po 'di tempo prima che appaia, quindi spero di non dover superare Thunderbird e sfogliare lunghi registri per scoprire quale file ha il maggior numero di scritture.


Risposte:


6

Se si collega strace al processo proprio quando è bloccato (è possibile ottenere il pid e mettere in coda il comando in anticipo, in un terminale di riserva), mostrerà il descrittore di file della scrittura bloccante.

Esempio di prova:

$ mkfifo tmp
$ cat /dev/urandom > tmp &
[1] 636226
  # this will block on open until someone opens for reading

$ exec 4<tmp
  # now it should be blocked trying to write

$ strace -p 636226
Process 636226 attached - interrupt to quit
write(1, "L!\f\335\330\27\374\360\212\244c\326\0\356j\374`\310C\30Z\362W\307\365Rv\244?o\225N"..., 4096 <unfinished ...>
^C
Process 636226 detached

Grazie, non sapevo di poter collegare la strace mentre il processo è in esecuzione. Ci proverò.
Philipp Wendler,

1
È possibile incrociare queste informazioni con lsof -p $PID, al fine di sapere dove punta il descrittore di file
Coren,

1
o ls -l /proc/pid/fdsu Linux
Inutile

Usando strace ho potuto scoprire esattamente cosa volevo sapere, quindi grazie ancora!
Philipp Wendler,

2

Se si dispone dell'accesso root, penso che lo strumento migliore sarebbe il sottosistema di controllo . Non c'è molta letteratura al riguardo (ma più che sui log registrati); si può iniziare con questo tutorial o un paio di esempi o semplicemente con la auditctlpagina man . Qui, dovrebbe essere sufficiente assicurarsi che il demone sia avviato, quindi eseguire auditctlcome root:

auditctl -a exit,always -F pid=1234 -F dir=/home/philipp

Questo scriverà nei log /var/log/audit/audit.logogni volta che il processo con pid 1234 scrive da qualche parte sotto /home/philipp. Il sovraccarico è piuttosto piccolo, molto più piccolo di strace.


Grazie per aver segnalato i sottosistemi di audit come un'interessante alternativa alla strace. Tuttavia, non sembra aiutare qui in quanto sembra registrare solo quando il file è aperto, e quindi non riesco a scoprire quanto è scritto in ciascun file.
Philipp Wendler,

@PhilippWendler Ah. Hmmm. Prova ad aggiungere -S read -S write(non testato).
Gilles 'SO- smetti di essere malvagio' il
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.