Comment afficher les descripteurs de fichiers ouverts sans utiliser la commande lsof

48

Bonjour, J'ai lu ici que lsof n'est pas un moyen précis d'obtenir le nombre de descripteurs de fichiers actuellement ouverts. Il a recommandé d'utiliser cette commande à la place

 cat /proc/sys/fs/file-nr

Alors que cette commande affiche le nombre de FD, comment affichez-vous la liste des descripteurs de fichiers ouverts que la commande ci-dessus vient de comptabiliser?

dimas
la source
4
Vous voulez probablement savoir si votre ulimit est dépassé, non? J'ai blogué à ce sujet sous linuxintro.org/wiki/Is_my_ulimit_exceeded ; plus important encore, ulimit est une restriction par processus que vous pouvez trouver dans / proc / PID / limits et au lieu de lsof, j’utiliserais ls / proc / PID / fd pour répertorier les descripteurs de fichiers du processus.
Thorsten Staerk

Réponses:

60

Il y a deux raisons pour lesquelles lsof | wc -lles descripteurs de fichier ne sont pas pris en compte. La première est qu’il répertorie les éléments qui ne sont pas des fichiers ouverts, tels que les bibliothèques liées dynamiquement et les répertoires de travail en cours; vous devez les filtrer. Une autre est que cela lsofprend du temps à exécuter, donc peut rater des fichiers qui sont ouverts ou fermés pendant son exécution; par conséquent, le nombre de fichiers ouverts répertoriés est approximatif. Regarder /proc/sys/fs/file-nrvous donne une valeur exacte à un moment donné.

cat /proc/sys/fs/file-nrn’est utile que lorsque vous avez besoin du chiffre exact, principalement pour vérifier l’épuisement des ressources. Si vous souhaitez répertorier les fichiers ouverts, vous devez appeler lsofou utiliser une méthode équivalente, telle que le chalutage /proc/*/fdmanuellement.

Gilles, arrête de faire le mal
la source
1
Bonjour, merci de donner une bonne explication, Gilles. J'ai essayé ls / proc / * / fd et j'ai obtenu tous les fd ouverts à ce moment-là. Son produisant une sortie avec un code couleur, je vais devoir regarder le manuel.
Dimas
Les /proc/*/fdrépertoires @dimas contiennent des liens symboliques vers les fichiers ouverts. Pour l'inspection visuelle, utilisez ls -l. Pour le traitement automatisé, utilisez readlinkpour extraire la cible du lien.
Gilles, arrête de faire le mal
Utilisez simplement ls -l mais je vais expérimenter avec readlink. J'ai essayé d'autres / proc / PID / maps et d'autres options comme spécifié ici kernel.org/doc/man-pages/online/pages/man5/proc.5.html . Merci encore pour l'info supplémentaire.
DIMAS
1
/ proc / sys / fs / fichier-nr me donne 3872 (et deux autres nombres). Comment est-ce que cela peut être le nombre de fichiers que j'ai ouverts si ulimit -n me montre 1024?
Thorsten Staerk
1
@ThorstenStaerk Tous les paramètres de setrlimit(l'appel système sous-jacent à la ulimitcommande shell) sont définis par processus. Ils n'affectent que le processus qui effectue l'appel (et indirectement les processus qu'il demande plus tard).
Gilles, arrête de faire le mal
25

Les informations de processus sont conservées dynamiquement par le système dans des répertoires sous / proc. Par exemple, le processus avec le PID 1234 aura un répertoire appelé / proc / 1234.

Il contient pas mal d’informations, mais pour l’instant, le sous-répertoire / proc / 1234 / fd vous intéresse .

REMARQUE: Vous devez disposer d'autorisations root pour afficher ou ouvrir des fichiers pour les processus que vous ne possédez pas, ainsi que pour les processus SetUID.

Exemple:

root@johan-HP-ProBook-6560b-LG654EA-ACQ:/proc# ls -l 2443/fd
total 0
lr-x------ 1 johan johan 64 Feb 27 10:26 0 -> pipe:[13637]
l-wx------ 1 johan johan 64 Feb 27 10:26 1 -> /home/johan/.xsession-errors
lrwx------ 1 johan johan 64 Feb 27 10:26 10 -> anon_inode:[eventfd]
lrwx------ 1 johan johan 64 Feb 27 10:26 11 -> anon_inode:[eventfd]
lrwx------ 1 johan johan 64 Feb 27 10:26 12 -> socket:[39495]
lrwx------ 1 johan johan 64 Feb 27 10:26 13 -> anon_inode:[eventfd]
lr-x------ 1 johan johan 64 Feb 27 10:26 14 -> anon_inode:inotify
lrwx------ 1 johan johan 64 Feb 27 10:26 15 -> anon_inode:[eventfd]
l-wx------ 1 johan johan 64 Feb 27 10:26 16 -> pipe:[37885]
lr-x------ 1 johan johan 64 Feb 27 10:26 17 -> pipe:[37886]
l-wx------ 1 johan johan 64 Feb 27 10:26 2 -> /home/johan/.xsession-errors
l-wx------ 1 johan johan 64 Feb 27 10:26 21 -> pipe:[167984]
lr-x------ 1 johan johan 64 Feb 27 10:26 22 -> pipe:[167985]
l-wx------ 1 johan johan 64 Feb 27 10:26 23 -> pipe:[170009]
lr-x------ 1 johan johan 64 Feb 27 10:26 24 -> pipe:[170010]
lrwx------ 1 johan johan 64 Feb 27 10:26 3 -> anon_inode:[eventfd]
lr-x------ 1 johan johan 64 Feb 27 10:26 4 -> pipe:[14726]
lrwx------ 1 johan johan 64 Feb 27 10:26 5 -> socket:[14721]
l-wx------ 1 johan johan 64 Feb 27 10:26 6 -> pipe:[14726]
lrwx------ 1 johan johan 64 Feb 27 10:26 7 -> socket:[14730]
lrwx------ 1 johan johan 64 Feb 27 10:26 8 -> socket:[13984]
lrwx------ 1 johan johan 64 Feb 27 10:26 9 -> socket:[14767]

root@johan-HP:/proc# cat 2443/fdinfo/2
pos:    1244446
flags:  0102001

Jetez également un coup d'œil au reste des fichiers sous / proc ... vous trouverez ici de nombreuses informations utiles provenant du système.

Johan
la source