monitorar arquivos de processo abertos no linux (em tempo real)

10

Os arquivos abertos pelo processo XYZ podem ser encontrados com o comando

ls -l /proc/PID/fd

Existe alguma maneira que possa ser feita de uma maneira mais interativa, como taila atualização automática a cada x segundos?

Frankie
fonte

Respostas:

15

Experimente o watchcomando:

watch -n 10 ls -l /proc/$$/fd

O relógio é bom.

Você pode usar uma velha escola while loop:

while :
do
 ls -l /proc/$$/fd
 sleep 10
done

watchestá no pacote procps em sistemas baseados em debian e o procps rpm em sistemas derivados RedHat.

davey
fonte
1
o sono em si pode ser usado como condição no loop while, para que seu exemplo possa ser escrito de forma mais elegante assim: while sleep 10; faça ls -l / proc / $$ / fd; feito
ipozgaj
7

Se você deseja ver cada arquivo enquanto ele está sendo aberto, é possível filtrá-lo com strace. Por exemplo:

strace -p _pid_of_app_ -e trace=open,close
Evgeny
fonte
2
Esta é realmente a melhor resposta. Eu recomendaria os sinalizadores -ye -fse você estiver tentando depurar algo em execução em um shell. Basta passar o PID do shell e -fseguirá os garfos.
Aea,
4

Você pode combinar lsofe watch.

Por exemplo watch "lsof -p 1234", você terá uma lista de todos os arquivos abertos do pid 1234 a cada 2 segundos. Você pode alterar alguns parâmetros para atender às suas necessidades.

cristão
fonte
não dará uma lista a cada 2 segundos. O parâmetro -r 2 está faltando para que isso funcione! -p é o PID. A resposta é muito ruim!
mahatmanich
2
Bom, não estava ciente da -ropção lsof. Portanto, eu costumava watchexecutar a lsofcada dois segundos.
Christian
0

Criei um arquivo bash onde estava gravando a saída do comando em um arquivo. O arquivo foi gerado na data atual base. Aqui estou contando o número de arquivos abertos.

#!/bin/bash
while :
do
 cd /proc/<PID>/fd
 today=$(date +"%m-%d-%Y")
 filename="/tmp/${today}.txt"
 ls -l | wc -l >> "${filename}"
 sleep 10
done
Akanksha Sharma
fonte