如果两个进程通过管道连接,
> cmd1 | cmd2
有什么办法可以cmd1
找出管道(cmd2
)另一端的进程的名称(或PID)吗?
另外,反之亦然,有什么方法可以cmd2
获取 的名称/PID 吗cmd1
?
我知道需要isatty(3)
检查输出是否到达(或输入来自)终端,所以我想知道是否有办法了解更多有关另一端的信息。
答案1
您可以在 中看到管道/proc/$PID/fd
。描述符是类似于 的符号链接pipe:[188528098]
。利用该信息,您可以搜索其他进程:
$ 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
或者,如果您想确保(为了自动处理)该数字是套接字而不是文件名的一部分:
$ lsof -n | awk 'NF==9 && $5=="FIFO" && $9=="pipe" && $8==188528098'
对于lsof
4.88 及更高版本,您还可以使用-E
或+E
标志:
-p <pid>
与,结合-d <descriptor>
,可以获得特定的端点信息描述符给定的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
上面告诉我们fd
0 ofsh
是一个管道,sleep
另一端是 fd 1 of 。如果更改-E
为+E
,您还可以获得该 fd 的完整信息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
(看看lsof
它的标准输入上也有管道)