有没有办法在不遍历 /proc/ 中的所有进程的情况下识别套接字的 PID(或 cgroup)

jam*_*mie 5 inode cgroups socket

我需要确定给定套接字的进程的 cgroup。具体来说,我在使用 tcp 调用我的进程的同一台机器上有一个进程,我需要识别该进程或其 cgroup。tcp 要求是因为我正在模拟第三方 API。我需要根据调用我的进程返回不同的数据。一种解决方案是使用 /proc/net/tcp 确定套接字,我可以从中获取套接字的 inode,然后遍历 /proc/*/fd 以找到列出的 inode。没有这种迭代,是否有直接的方法可以从(我假设是 sockfs)inode 映射到其 PID?

Gil*_*il' 5

一般来说,要找到套接字另一端的内容,您需要迭代/proc. 这当然可能意味着让现有的工具(例如netstatlsof或 )ss为您完成这项工作。

\n\n

原因是套接字可以由不同的进程打开。一旦进程打开了套接字,它就可以分叉,子进程可以更改其权限并切换到不同的名称空间。还可以使用 unix 套接字上的辅助数据将文件描述符从进程传递到不相关的进程。因此任意进程都可以打开相同的套接字。不存在\xe2\x80\x9c套接字\xe2\x80\x9d的PID,只有\xe2\x80\x9c套接字\xe2\x80\x9d的PID。

\n\n

虽然这并不能证明没有办法枚举给定套接字的 PID,但设计这样的接口将非常困难,特别是当您考虑到非 root 用户无法知道进程何时打开文件时以不同用户身份运行。访问通过/proc权限强制安全性,我不知道有任何其他接口可以获取相同的数据。另外,fuserlsofnetstat以及ss所有枚举/proc;如果有另一个界面,我希望有人会使用它。所以我很确定没有其他办法。

\n