有没有一种方法可以识别套接字的 PID(或 cgroup),而无需迭代 /proc/ 中的所有进程

有没有一种方法可以识别套接字的 PID(或 cgroup),而无需迭代 /proc/ 中的所有进程

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

答案1

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

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

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

答案2

确定cgroup可以参考.cgroupsk_cgrp_data中的字段struct sock。这是来自__cgroup_bpf_run_filter_sock_ops()以下的示例kernel/bpf/cgroup.c

struct cgroup *cgrp = sock_cgroup_ptr(&sk->sk_cgrp_data)

答案3

如果您知道 tcp 端口号,则可以在终端中使用以下命令:

$ lsof | grep TCP | 查询grep 你的端口号

例如:lsof | grep TCP | 查询正则表达式 1234

相关内容