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?

techfun
la source
@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
Grawity
la source
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

tohuwawohu
la source
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