Comment puis-je imprimer les noms de fichiers sur la commande linux si je connais le descripteur de fichier d'un fichier ouvert par un processus?


4

Je connais le descripteur de fichier d'un fichier ouvert par un processus, mais je ne connais pas l'ID du processus. Comment puis-je imprimer les noms de fichier à partir de l'invite de commande Linux si je connais le descripteur de fichier d'un fichier ouvert par un processus?


@tohuwawohu C'est la liste des fichiers utilisant les identifiants de processus. Ici, dans ce cas, je n'ai pas d'identifiant de processus uniquement fichier decriptor
techfun

ah, d'accord, désolé, je n'ai pas compris ce point. Donc vous avez raison, ce n'est pas une dupe.
tohuwawohu

Réponses:


3

Si vous ne connaissez pas l'ID de processus, vous devrez vérifier tous les processus ayant le même fichier ouvert fd #, car les descripteurs de fichier ne sont pas globalement uniques. Plus le nombre fd # est petit, plus le nombre de processus ouverts sera important (par exemple, sur mon système, même si le nombre fd # est autour de 30, je devrais encore deviner entre 15 processus, et si je cherchais fd # autour de 10, alors la liste aurait ~ 170 processus).

Le système de fichiers proc affiche les descripteurs de fichier sous forme de liens symboliques sous ./proc/<pid>/fd

# ls -l / proc / 1 / fd
lrwx ------ 1 racine racine 64 12 février 22:10 / proc / 1 / fd / 0 -> / dev / null
lrwx ------ 1 racine racine 64 12 février 22:10 / proc / 1 / fd / 1 -> / dev / null
lrwx ------ 1 racine racine 64 12 février 22:10 / proc / 1 / fd / 2 -> / dev / null
l-wx ------ 1 racine racine 64 12 février 22:10 / proc / 1 / fd / 3 -> / dev / kmsg
lrwx ------ 1 racine racine 64 12 février 22:10 / proc / 1 / fd / 4 -> anon_inode: [eventpoll]
lrwx ------ 1 racine racine 64 12 février 22:10 / proc / 1 / fd / 5 -> anon_inode: [signalfd]
lr-x ------ 1 racine racine 64 12 février 22:10 / proc / 1 / fd / 6 -> / sys / fs / cgroup / systemd /
...etc...

Par exemple, pour rechercher le numéro 5 dans tous les processus:

# ls -l / proc / * / fd / 5
lrwx ------ 1 racine racine 64 12 février 22:10 / proc / 1 / fd / 5 -> anon_inode: [signalfd]
lrwx ------ 1 racine racine 64 12 février 22:15 / proc / 129 / fd / 5 -> socket: [6980]
lrwx ------ 1 racine racine 64 12 février 22:15 / proc / 168 / fd / 5 -> socket: [7847]
lrwx ------ 1 racine racine 64 12 février 22:15 / proc / 341 / fd / 5 -> anon_inode: [eventfd]
lr-x ------ 1 racine racine 64 12 février 22:15 / proc / 342 / fd / 5 -> anon_inode: inotify
...etc...

L'interface exacte pour résoudre les cibles de liens symboliques est readlink():

# readlink / proc / 427529 / fd / 7
/home/grawity/lib/dotfiles/vim/backup/%home%grawity%.bashrc.swp

Très bonne réponse! Maintenant, même je comprends ce qui se passe :-)
tohuwawohu

1

De la page de manuel lsof :

Pour trouver le processus qui a / u / abe / foo ouvert, utilisez:

lsof /u/abe/foo

Voir aussi ce tutoriel surlsof ANS ces conseils sur lalsof


Merci pour la réponse. Mais en fait, je ne sais pas dans ce cas "fichier / u / capable / foo". Seul le descripteur de fichier est disponible
techfun

Pourriez-vous s'il vous plaît donner un exemple?
tohuwawohu

Je sais que le descripteur de fichier (nombre entier) est ouvert par un processus aléatoire qui commence sur le serveur. Il reste ouvert après l'appel du processus. J'ai besoin de connaître le chemin du fichier.
Techfun

1
Désolé, je suis complètement confus. Cette réponse vous explique comment obtenir tous les noms de fichiers, y compris le chemin, si vous connaissez le processus. Donc, soit vous connaissez le fichier à vérifier, ma réponse s’applique alors, soit vous connaissez le processus, puis la réponse liée s’applique. Je ne vois tout simplement pas ce qui manque :-(
tohuwawohu

Je pense qu'il y a une lsofincantation qui listerait un fd # spécifique dans tous les processus, mais je n'ai aucune idée de ce à quoi il ressemble.
Grawity
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.