如何在Linux的/ proc中获得有关打开管道的更多信息?


53

在Linux中,如果您/proc/<pid>/fd经常进行挖掘,则会看到类似以下的输出:

lrwx------ 1 root root 64 Jul 30 15:14 0 -> /dev/null
lrwx------ 1 root root 64 Jul 30 15:14 1 -> /dev/null
l-wx------ 1 root root 64 Jul 30 15:14 10 -> pipe:[90222668]
lr-x------ 1 root root 64 Jul 30 15:14 11 -> pipe:[90222669]
l-wx------ 1 root root 64 Jul 30 15:14 13 -> pipe:[90225058]
lr-x------ 1 root root 64 Jul 30 15:14 14 -> pipe:[90225059]

如何获得有关打开的管道的更多信息,例如另一端是哪个进程?


lsof的整体查找/proc速度很慢。有人可以提供更有效的解决方案吗?
pihentagy 2014年

Answers:


46

与其他答案类似,但是:

lsof | grep 90222668

将显示两端,因为两端共享“管道号”。


3
嗯当然了 可以正常工作。您甚至可以通过查看输出的第四列来告诉文件描述符号,哪一端是读取器,哪一端是写入器!
卡米尔·基西尔

我认为该数字可能是您无法挂载的pipefs管道的inode编号。我正在寻找一种将inode映射到文件名映射的方法,但这可能是最好的方法。顺便说一句,我喜欢这个问题:-)
凯尔·勃兰特

不知何故,这对我不起作用。它输出的只是管道本身。
Rui Marques 2014年

以标准用户身份运行lsof可能不会为您提供所有进程的信息。通常,您无权以非root用户身份查看所有进程的/ proc / <pid> / fd目录。
Andre Holzner

5
另外,您可能希望使用它lsof -n -P | grep 90222668来避免不必要的名称查找,这样可以加快名称查找的速度。
Wodin '16

4

找到另一端进程的唯一方法是循环遍历/ proc中的所有进程,并查看哪些进程正在使用该管道(即,在/ proc / pid / fd中具有指向相同管道ID的符号链接)


谢谢你的提示。自动执行此操作的一种方法是:ls -l /proc/*/fd/ | grep $PIPE_ID; ls -l /proc/*/fd/$FD | grep $PIPE_ID 第一个ls命令将打印管道两端的文件描述符,而第二个命令将为您提供进程ID
Joao Costa

2

我知道如何在开放管道上获得最多的信息是

lsof|grep FIFO

恐怕仍然只能说一说。


就像我可以从/ proc得知的一样,我假设lsof从同一个位置获取它。
卡米尔·基西尔
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.