Trouvez quel processus est à l'autre bout du tuyau

34

J'essaie de tracer un comportement étrange de quelques processus et je suis tombé sur un point que je ne sais pas comment tracer le passé. Le processus suspendu, que j'ai attaché à l'utilisation, a strace -pmontré ceci:

Process 7926 attached - interrupt to quit
read(3, 

D'accord, il attend donc une entrée sur fd 3, alors je suis allé vérifier de quoi il s'agit:

$ ls -l /proc/7926/fd/3
lr-x------ 1 user grp 64 Mar 15 10:41 /proc/7926/fd/3 -> pipe:[20043922]

D'accord, c'est donc une pipe ... maintenant la question - qui est l'auteur de cette pipe? Je rappelle que sous Linux, il existe une fonctionnalité spéciale pour les sockets de domaine Unix où vous pouvez demander un chemin de fichier qui commence par un octet NUL pour accéder à "l'espace de noms de socket abstrait" (mentionné ici: http://tkhanson.net/cgit.cgi /misc.git/plain/unixdomain/Unix_domain_sockets.html ). Je ne sais pas s'il y a quelque chose de similaire pour les tuyaux dont je pourrais profiter, mais je n'ai rien trouvé.

J'espérais un outil comme fuserou lsofpourrait aider, mais je n'ai rien obtenu.

Des idées?

Erreur fatale
la source

Réponses:

32

Le contenu du lien symbolique "pipe: [20043922]" est un ID unique; l'autre extrémité du tuyau aura un ID correspondant.

(find /proc -type l | xargs ls -l | fgrep 'pipe:[20043922]') 2>/dev/null

devrait vous montrer les deux extrémités du tuyau.

Kyle Jones
la source
1
Bonne réflexion, merci! En enquêtant, je suis également tombé sur ce sujet ici serverfault.com/questions/48330/… donc j'ai pensé que je laisserais le lien ici aussi juste pour les autres.
FatalError
2

Vous pouvez obtenir la liste des processus utilisant le canal en utilisant la lsofcommande:

lsof | grep 'FIFO.*20043922'

La sortie affichera les lecteurs (dans la colonne FD avec des entrées comme 1r) et les écrivains (mêmes colonnes avec des entrées comme 2w).

Eugen
la source