You can see the pipe in /proc/$PID/fd
. The descriptor is a symlink to something like pipe:[188528098]
. With that information you can search for the other process:
$ 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
Or, if you want to be sure (for automatic processing) that the number is the socket and not part of a file name:
$ lsof -n | awk 'NF==9 && $5=="FIFO" && $9=="pipe" && $8==188528098'
With lsof
4.88 and above, you can also use the -E
or +E
flags:
In combination with -p <pid>
, -d <descriptor>
, you can get the endpoint information for a specific descriptor of a given 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
Above telling us that fd
0 of sh
is a pipe with fd 1 of sleep
at the other end. If you change -E
to +E
, you also get the full information for that fd of 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
(see how lsof
also has the pipe on its stdin)
cmd2
forked. – Nate Eldredge Nov 19 '17 at 00:16cmd1 | (cmd2 & cmd3)
– Barmar Nov 22 '17 at 17:40