如何找出向另一个进程输送数据的管道进程ID?
查找向目标进程输送STDIN数据的管道进程ID方法
1. 通过/proc文件系统定位管道inode
首先确定目标进程的PID(记为$TARGET_PID),然后执行以下操作:
- 进入目标进程的文件描述符目录:
cd /proc/$TARGET_PID/fd - 查看STDIN对应的0号文件描述符:
ls -l 0
若为管道,输出会类似lrwx------ 1 user user 64 Aug 10 12:00 0 -> pipe:[12345],其中12345是管道的inode编号。
2. 用lsof查找关联管道的进程
拿到管道inode后,执行以下命令过滤出所有关联该管道的进程:
sudo lsof -n | grep "pipe:[12345]"
输出结果中,除了目标进程外,另一个就是向它写入数据的进程。如果之前用lsof失败,大概率是没加sudo(权限不足)或没加-n(DNS解析导致延迟/错误)。
3. 用pstree快速排查进程树
如果管道是由进程管理器的子/兄弟进程创建的,直接查看进程树:
pstree -p $TARGET_PID
通过层级关系可以快速定位和目标进程关联的进程,尤其是同属一个进程管理器的进程。
4. 借助ss工具列出进程关联的管道
类Linux系统下,ss可以列出进程的管道关联信息:
sudo ss -xp | grep $TARGET_PID
找到对应管道的inode后,再反向查找持有该inode的进程即可。
注意事项
- 如果目标进程处于容器或隔离命名空间中,需要用
nsenter进入对应命名空间后再执行上述命令,比如:sudo nsenter -t $TARGET_PID -n -p -- bash - 所有工具操作建议加
sudo,避免因权限不足无法读取进程的/proc信息或lsof/ss的完整输出。
内容的提问来源于stack exchange,提问作者tinkerbeast
相关产品推荐
相关产品推荐

