Nom du processus à l'autre extrémité d'un tube Unix?

8

Si deux processus sont connectés par un tuyau,

> cmd1 | cmd2

existe-t-il un moyen cmd1de connaître le nom (ou PID) du processus de l'autre côté du tuyau ( cmd2)?

Aussi, vice versa, existe-t-il un moyen cmd2d'obtenir le nom / PID de cmd1?

Je sais qu'il isatty(3)faut vérifier si la sortie va (ou si l'entrée vient) d'un terminal, alors je me suis demandé s'il y avait un moyen d'en savoir un peu plus sur l'autre côté.

shark.dp
la source
1
Ce serait au mieux spécifique à la plate-forme; où essayez-vous de le faire?
Michael Homer
Je serais bien avec une version spécifique à Linux.
shark.dp
5
En théorie, il pourrait y avoir plus d'un processus à l'autre extrémité du tuyau, s'il est cmd2bifurqué.
Nate Eldredge
6
Bien que cela soit possible, je doute vraiment que ce soit une bonne idée; cette question sent comme un problème XY.
Nate Eldredge
@NateEldredge En effet:cmd1 | (cmd2 & cmd3)
Barmar

Réponses:

14

Vous pouvez voir le tuyau /proc/$PID/fd. Le descripteur est un lien symbolique vers quelque chose comme pipe:[188528098]. Avec ces informations, vous pouvez rechercher l'autre processus:

$ lsof -n | grep -w 188528098
sleep      1565   hl    1w     FIFO    0,12     0t0  188528098 pipe
sleep      1566   hl    0r     FIFO    0,12     0t0  188528098 pipe

Ou, si vous voulez être sûr (pour le traitement automatique) que le numéro est le socket et ne fait pas partie d'un nom de fichier:

$ lsof -n | awk 'NF==9 && $5=="FIFO" && $9=="pipe" && $8==188528098'

Avec lsof4.88 et supérieur, vous pouvez également utiliser les drapeaux -Eou +E:

En combinaison avec -p <pid>, -d <descriptor>vous pouvez obtenir les informations de point final pour un particulier descripteur d'une donnée pid .

$ sleep 1 | sh -c 'lsof -E -ap "$$" -d 0; exit'
COMMAND   PID     USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
sh      27176 chazelas    0r  FIFO   0,10      0t0 2609460 pipe 27175,sleep,1w

Ci-dessus nous disant que fd0 de shest un tuyau avec fd 1 de sleepl'autre extrémité. Si vous passez -Eà +E, vous obtenez également les informations complètes pour ce fd de sleep:

$ sleep 1 | sh -c 'lsof +E -ap "$$" -d 0; exit'
COMMAND   PID     USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
sleep   27066 chazelas    1w  FIFO   0,10      0t0 2586272 pipe 27067,sh,0r 27068,lsof,0r
sh      27067 chazelas    0r  FIFO   0,10      0t0 2586272 pipe 27066,sleep,1w

(voir comment a lsofégalement le tuyau sur son stdin)

Hauke ​​Laging
la source
6
Il faut être prêt à ce que cela échoue; Par exemple, si le processus à l'autre extrémité a changé d'UID et que vous n'y êtes pas autorisé lsof.
Nate Eldredge