surveiller les fichiers de processus ouverts sur linux (en temps réel)

10

Les fichiers ouverts par le processus XYZ peuvent être trouvés avec la commande

ls -l /proc/PID/fd

Existe-t-il de toute façon une méthode plus interactive comme taill'actualisation automatique toutes les x secondes?

Frankie
la source

Réponses:

15

Essayez la watchcommande:

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

La montre est belle.

Vous pouvez utiliser une boucle old school while:

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

watchest dans le paquet procps sur les systèmes basés sur Debian et le rpm procps sur les systèmes dérivés de RedHat.

Davey
la source
1
sleep lui-même peut être utilisé comme condition dans la boucle while, donc votre exemple peut être écrit de façon plus élégante comme ceci: while sleep 10; faire ls -l / proc / $$ / fd; fait
ipozgaj
7

Si vous souhaitez voir chaque fichier lors de son ouverture, vous pouvez le filtrer avec strace. Par exemple:

strace -p _pid_of_app_ -e trace=open,close
Evgeny
la source
2
C'est vraiment la meilleure réponse. Je recommanderais les drapeaux -yet -fsi vous essayez de déboguer quelque chose qui s'exécute dans un shell. Il suffit de passer le shell PID et -fsuivra toutes les fourches.
Aea
4

Vous pouvez combiner lsofet watch.

Par exemple watch "lsof -p 1234", vous donnera une liste de tous les fichiers ouverts de pid 1234 toutes les 2 secondes. Vous pouvez modifier certains paramètres pour répondre à vos besoins.

Christian
la source
il ne donnera pas de liste TOUTES les 2 secondes. Le paramètre -r 2 est manquant pour que cela fonctionne! -p est le PID. La réponse est très mauvaise!
mahatmanich
2
Nice, n'était pas au courant de l' -roption pour lsof. Par conséquent, j'avais l'habitude watchd'exécuter lsoftoutes les deux secondes.
Christian
0

J'ai créé un fichier bash où j'écrivais la sortie de la commande dans un fichier. Le fichier a été généré à la date actuelle de base. Ici, je compte le nombre de fichiers ouverts.

#!/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
la source