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.

Philipp Wendler
fonte
Consulte também Log de conexões de saída como elas acontecem para conexões de rede
Gilles 'SO- stop be evil'

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
Sem utilidade
fonte
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.

Gilles 'SO- parar de ser mau'
fonte
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'