Como descobrir qual arquivo está atualmente gravado por um processo


9

Minha situação é que, de tempos em tempos, um processo específico (nesse caso, é o Thunderbird) não reage à entrada do usuário por um minuto ou mais. Descobri iotopque, durante esse período, ele grava bastante no disco e agora quero descobrir em qual arquivo ele grava, mas infelizmente iotopfornece apenas estatísticas por processo e não por arquivo aberto (-descriptor).

Eu sei que posso usar lsofpara descobrir quais arquivos o processo está aberto no momento, mas é claro que o Thunderbird tem muitos deles abertos, portanto isso não é tão útil. iostatmostra apenas estatísticas por dispositivo.

O problema ocorre apenas aleatoriamente e pode levar algum tempo para que ele apareça, por isso espero não precisar rastrear o Thunderbird e percorrer longos logs para descobrir qual arquivo tem mais gravações.


Respostas:


6

Se você anexar strace ao processo exatamente quando estiver travado (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!\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

Obrigado, eu não sabia que posso anexar strace enquanto o processo está em execução. Vou tentar isso.
Philipp Wendler

11
Você pode cruzar essas informações com lsof -p $PID, a fim de saber para onde o descritor de arquivo aponta
Coren

11
ou ls -l /proc/pid/fdno Linux
Inútil

Usando strace, eu poderia descobrir exatamente o que eu queria saber, então obrigado novamente!
Philipp Wendler

2

Se você tem 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 exemplos ou apenas com a auditctlpágina do homem . Aqui, deve ser suficiente garantir que o daemon seja iniciado e, em seguida, execute auditctlcomo root:

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

Isso irá gravar nos logs /var/log/audit/audit.logsempre que o processo com o pid 1234 gravar em algum lugar abaixo /home/philipp. A sobrecarga é bastante pequena, muito menor que strace.


Obrigado por apontar os subsistemas de auditoria como uma alternativa interessante ao strace. No entanto, ele não parece ajudar aqui, pois parece registrar apenas quando o arquivo é aberto e, portanto, não consigo descobrir quanto está gravado em cada arquivo.
Philipp Wendler

@PhilippWendler Ah. Hummm. Tente adicionar -S read -S write(não testado).
Gilles 'SO- stop be evil'
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.