Nombre del proceso en el otro extremo de una tubería Unix?

8

Si dos procesos están conectados por una tubería,

> cmd1 | cmd2

¿Hay alguna forma de cmd1averiguar el nombre (o PID) del proceso en el otro lado de la tubería ( cmd2)?

Además, viceversa, ¿hay alguna forma de cmd2obtener el nombre / PID de cmd1?

Sé que hay isatty(3)que verificar si la salida va (o la entrada proviene) a un terminal, así que me pregunté si hay una manera de averiguar un poco más sobre el otro lado.

shark.dp
fuente
1
Esto sería específico de la plataforma en el mejor de los casos; donde intentas hacerlo?
Michael Homer
Estaría bien con una versión específica de Linux.
shark.dp
55
En teoría, podría haber más de un proceso en el otro extremo de la tubería, si se cmd2bifurca.
Nate Eldredge
66
Aunque esto puede ser posible, realmente dudo que sea una buena idea; Esta pregunta huele a un problema XY.
Nate Eldredge
@NateEldredge De hecho:cmd1 | (cmd2 & cmd3)
Barmar

Respuestas:

14

Puedes ver la tubería adentro /proc/$PID/fd. El descriptor es un enlace simbólico a algo así pipe:[188528098]. Con esa información puede buscar el otro proceso:

$ 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

O, si desea estar seguro (para el procesamiento automático) de que el número es el socket y no parte del nombre de un archivo:

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

Con lsof4.88 y superior, también puede usar las banderas -Eo +E:

En combinación con -p <pid>, -d <descriptor>puede obtener la información del punto final para un descriptor específico de un pid dado .

$ 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

Por encima de decirnos que fd0 de shes una tubería con fd 1 de sleepen el otro extremo. Si cambia -Ea +E, también obtiene la información completa para ese 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

(vea cómo lsoftambién tiene la tubería en su stdin)

Hauke ​​Laging
fuente
66
Uno debe estar preparado para que esto falle; por ejemplo, si el proceso en el otro extremo ha cambiado los UID y no tiene permiso para lsofhacerlo.
Nate Eldredge