Como descobrir qual arquivo está atualmente escrito por um processo

9

Minha situação é que, de tempos em tempos, um processo específico (neste caso, o Thunderbird) não reage à entrada do usuário por um minuto ou mais. Eu descobri usando iotop que durante este tempo, ele escreve bastante no disco, e agora eu quero descobrir para qual arquivo ele grava, mas infelizmente iotop fornece apenas estatísticas por processo e não por arquivo aberto ( -descriptor).

Eu sei que posso usar lsof para descobrir quais arquivos o processo está aberto no momento, mas é claro que o Thunderbird tem muitos deles abertos, então isso não é muito útil. iostat mostra apenas estatísticas por dispositivo.

O problema ocorre apenas aleatoriamente e pode levar algum tempo para aparecer, então espero não ter que examinar o Thunderbird e percorrer longos logs para descobrir qual arquivo tem mais gravações.

    
por Philipp Wendler 10.02.2012 / 13:03

2 respostas

6

Se você anexar strace ao processo apenas quando ele estiver suspenso (você pode obter o pid e enfileirar o comando antecipadamente, em um terminal sobressalente), ele mostrará o descritor de arquivo da gravação de bloqueio.

Exemplo trivial:

$ 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!\f504024c6
$ 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!\f504024c6%pre%6j4'0CZ2W75Rv4?o5N"..., 4096 <unfinished ...>
^C
Process 636226 detached
6j4'0CZ2W75Rv4?o5N"..., 4096 <unfinished ...> ^C Process 636226 detached
    
por 10.02.2012 / 14:08
2

Se você tiver acesso root, acho que a melhor ferramenta seria o subsistema de auditoria . Não há muita literatura sobre isso (mas mais do que sobre logsfs); você pode começar com este tutorial ou um poucos examples ou apenas com o auditctl man page . Aqui, deve ser o suficiente para garantir que o daemon seja iniciado e, em seguida, execute auditctl como root:

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

Isso irá gravar nos logs em /var/log/audit/audit.log toda vez que o processo com pid 1234 for escrito em algum lugar abaixo de /home/philipp . A sobrecarga é relativamente pequena, muito menor que strace .

    
por 12.02.2012 / 13:43