可行,需结合TYPE列(值为FIFO)、FD列(如3r/4w或pipe)和NAME列(为空、pipe、anon_inode:[pipe]或命名管道路径)综合识别;匿名管道NAME通常为空,命名管道显示实际路径。

Linux 下用 lsof -p 查看进程打开的 pipe 管道是可行的,但默认输出里不会直接标出 “pipe”,需要结合 TYPE 和 NAME 列人工识别——因为 pipe 在内核中表现为 FIFO 类型文件,且 NAME 通常为空或显示为 pipe。
lsof -p 输出中怎么识别 pipe 管道
执行 lsof -p <pid></pid> 后,关键看三列:TYPE、FD、NAME:
-
TYPE列值为FIFO的行,基本就是管道(匿名 pipe 或命名 pipe) -
FD列若为数字(如3r、4w),说明是普通文件描述符打开的 pipe;若为pipe,则大概率是内核级匿名 pipe(父子进程间通信用) -
NAME列为空,或显示类似pipe、anon_inode:[pipe]、/tmp/myfifo(命名 pipe 路径) - 注意:匿名 pipe 不会出现在文件系统中,所以
NAME为空是正常现象;命名 pipe(FIFO 文件)会有实际路径
为什么 lsof -p 有时看不到 pipe?常见漏查原因
不是 pipe 不存在,而是没被当前 lsof -p 捕获到,原因包括:
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
- 进程已关闭读/写端,只剩一端打开(pipe 需两端同时存在才活跃,单端残留可能不显在
lsof中) - 调用的是
popen()创建的子进程管道,其 pipe fd 属于子进程,而非父进程 —— 此时要查子进程 PID,不是父进程 - 权限不足:
lsof默认无法查看其他用户进程的 fd,非 root 用户执行时,lsof -p只能看到自己拥有的进程 - pipe 已被关闭但缓冲区仍有数据(罕见),此时内核可能尚未彻底释放资源,
lsof不一定列出
确认 pipe 是否真实存在且活跃的辅助命令
单靠 lsof -p 容易误判,建议组合验证:
- 查该进程所有 fd 的底层类型:
ls -l /proc/<pid>/fd/ | grep -E "(pipe|FIFO)"</pid>—— 更直观看到pipe符号链接 - 过滤出 FIFO 类型并关联进程名:
lsof -p <pid> -d ^cwd,^txt,^mem -a -t | xargs -r ps -p</pid>(先筛出非标准 fd,再查对应进程) - 检查是否有命名 pipe 被打开:
lsof +D /path/to/fifo/dir(如果知道 FIFO 所在目录) - 对比
lsof -p <pid></pid>和cat /proc/<pid>/status | grep -i pipe</pid>,后者会显示SigPnd或ShdPnd等字段,但不直接反映 pipe fd,仅作参考
pipe 和 socket、regular file 的 FD 区分要点
同一进程里,不同资源共用 fd 编号,必须靠 TYPE 列区分:
-
TYPE = FIFO→ pipe(匿名或命名) -
TYPE = IPv4或IPv6→ socket 连接(不是 pipe) -
TYPE = REG且NAME是路径 → 普通文件;若NAME含(deleted),则是已删未释放文件,和 pipe 无关 -
TYPE = ANON_INODE且NAME是[eventpoll]或[timerfd]→ 其他内核对象,不是 pipe
最容易混淆的是 TYPE = FIFO 和 TYPE = PIPE:现代内核中 lsof 统一用 FIFO 表示两者,PIPE 类型已基本弃用;若看到 PIPE,说明内核或 lsof 版本较老。

















