Si dos procesos están conectados por una tubería,
> cmd1 | cmd2
¿Hay alguna forma de cmd1
averiguar el nombre (o PID) del proceso en el otro lado de la tubería ( cmd2
)?
Además, viceversa, ¿hay alguna forma de cmd2
obtener 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.
cmd2
bifurca.cmd1 | (cmd2 & cmd3)
Respuestas:
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: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:
Con
lsof
4.88 y superior, también puede usar las banderas-E
o+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 .Por encima de decirnos que
fd
0 desh
es una tubería con fd 1 desleep
en el otro extremo. Si cambia-E
a+E
, también obtiene la información completa para ese fd desleep
:(vea cómo
lsof
también tiene la tubería en su stdin)fuente
lsof
hacerlo.