41 votes

Trouver quel processus se trouve de l'autre côté d'un tuyau

Je suis en train de retracer un comportement étrange de quelques processus et j'ai rencontré un point où je ne suis pas sûr comment aller plus loin. Le processus en attente, auquel j'ai accédé en utilisant strace -p, a montré ceci :

Processus 7926 attaché - appuyez sur une touche pour quitter
read(3, 

D'accord, il attend donc une entrée sur le fd 3, donc je suis allé vérifier ce que c'est :

$ 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 un tube... maintenant la question -- qui est l'écrivain de ce tube ? Je me souviens qu'il y a une fonctionnalité spéciale sur Linux pour les sockets de domaine Unix où vous pouvez demander un chemin de fichier commençant par un octet NUL pour accéder à l'espace de nommage des sockets "abstraites" (mentionné ici : http://tkhanson.net/cgit.cgi/misc.git/plain/unixdomain/Unix_domain_sockets.html). Je ne suis pas sûr s'il y a quelque chose de similaire pour les tubes dont je pourrais profiter, mais je n'ai rien trouvé.

J'espérais qu'un outil comme fuser ou lsof pourrait m'aider, mais je n'ai rien trouvé.

Des idées ?

42voto

Bakuriu Points 592

Les contenus du lien symbolique "pipe:[20043922]" sont un identifiant unique; l'autre extrémité du tuyau aura un identifiant correspondant.

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

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

3voto

Eugen Points 191

Vous pouvez obtenir la liste des processus utilisant le pipe en utilisant la commande lsof :

lsof | grep 'FIFO.*20043922'

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

1voto

Johan Walles Points 111

J'utiliserais px.

Avertissement : Je l'ai écrit, donc bien sûr je le recommande.

px vous dira avec quels autres processus le vôtre communique, sudo px 7926 vous aurait donné la réponse.

Exemple de sortie (évidemment ce n'est pas votre PID, mais quand même), faites défiler jusqu'en bas pour suivre les pipes :

~ $ sudo px 76572
cat

noyaux(0)               root
  launchd(1)            root
    iTerm2(39341)       johan
      iTerm2(39343)     johan
        login(39344)    root
          -fish(39346)  johan
----------> cat(76572)  johan

Il y a 14,62 secondes, cat a été démarré à 2020-09-12T16:20:12+02:00.

Autres processus démarrés près de cat(76572) :
  CoreServices/mdworker_shared(76468) a été démarré 4m32s avant cat(76572)
  CoreServices/mdworker_shared(76475) a été démarré 4m02s avant cat(76572)
  CoreServices/mdworker_shared(76541) a été démarré 1m55s avant cat(76572)
  cat(76573) a été démarré juste après cat(76572)
  sudo px(76583) a été démarré 14,0s après cat(76572)

Utilisateurs connectés lorsque cat(76572) a démarré :
  johan

2020-09-12T16:20:26.739132: Maintenant invocation de lsof, cela peut prendre plus d'une minute sur un gros système...
2020-09-12T16:20:27.052847: lsof terminé, en cours.

Autres processus partageant le répertoire de travail de ce processus (/Users/johan) :
  cat(76573)
  -fish(39346)
  iTerm2(39343)
  login(39344)
  sudo px(76583)

Descripteurs de fichiers :
  stdin : [CHR] /dev/ttys000
  stdout: [PIPE] -> cat(76573) (0x204c1334a30aa50d)
  stderr: [CHR] /dev/ttys000

Connexions réseau :

Communication inter-processus :
  cat(76573): [PIPE] ->0x204c1334a30aa50d

Pour obtenir la liste de tous les fichiers ouverts, tapez "sudo lsof -p 76572" ou "sudo watch lsof -p 76572" pour une vue en direct.
~ $

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X