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

Modified on: Sat, 30 Jun 2018 04:33:00 +0800

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

> cmd1 | cmd2

cmd1是否有办法在管道的另一端找到进程的名称(或PID)(cmd2)?

另外,反之亦然,cmd2是否有办法获取cmd1的名称/ PID?

我知道有isatty(3)来检查输出是否转到(或输入来自)终端,所以我想知道是否有办法找出一点点更多关于另一方面。

最佳答案

您可以在/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

上面告诉我们fdsh 0是另一端有sleep的fd 1的管道。如果您将-E更改为+E,您还可以获得sleep的fd的完整信息:

$ 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如何在其stdin上有管道)

作者:,Hauke Laging

相关问答

添加新评论