unix 管道另一端的进程名称?

unix 管道另一端的进程名称?

如果两个进程通过管道连接,

> 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'

对于lsof4.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

上面告诉我们fd0 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它的标准输入上也有管道)

相关内容