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


8

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

> cmd1 | cmd2

有什么方法cmd1可以找出管道另一边的过程名称(或PID cmd2)?

另外,反之亦然,是否有任何方法cmd2可以获取的名称/ PID cmd1

我知道isatty(3)要检查输出是否到达终端(或输入来自终端),所以我想知道是否有办法找到更多有关另一端的信息。


1
充其量是特定于平台的;您要在哪里尝试?
Michael Homer

我会使用特定于Linux的版本。
shark.dp

5
理论上,如果cmd2分叉,则在管道的另一端可能会有多个过程。
Nate Eldredge

6
尽管这是可能的,但我真的怀疑这是个好主意。这个问题闻起来像XY问题。
Nate Eldredge

@NateEldredge确实:cmd1 | (cmd2 & cmd3)
Barmar

Answers:


14

您可以在中看到管道/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的sh一端是fd 1的管道sleep。如果更改-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在其stdin上也有管道)


6
应该为此做好准备;例如,如果另一端的进程已更改UID,而您没有权限lsof
Nate Eldredge
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.