我需要识别给定套接字的进程的 cgroup。具体来说,我在同一台机器上有一个进程正在使用 tcp 调用我的进程,并且我需要识别该进程或其 cgroup。 tcp 要求是因为我正在模拟第三方 API。我需要根据调用我的进程返回不同的数据。一种解决方案是使用 /proc/net/tcp 确定套接字,从中我可以获取套接字的 inode,然后迭代 /proc/*/fd 以查找列出的 inode。有没有直接的方法可以从一个(我假设是 sockfs)inode 映射到它的 PID 而无需此迭代?
答案1
一般来说,要找到套接字另一端的内容,您需要迭代/proc
.这当然可能意味着让现有的工具(例如netstat
、lsof
或 )ss
为您完成这项工作。
原因是套接字可以由不同的进程打开。一旦进程打开了套接字,它就可以分叉,子进程可以更改其权限并切换到不同的名称空间。还可以使用 unix 套接字上的辅助数据将文件描述符从进程传递到不相关的进程。因此任意进程都可以打开相同的套接字。不存在“套接字的 PID”这样的东西,只有“套接字的 PID”这样的东西。
虽然这并不能证明没有办法枚举给定套接字的 PID,但设计这样的接口会非常困难,特别是当您考虑到非 root 用户无法知道进程何时打开文件时以不同用户身份运行。访问通过/proc
权限强制安全性,我不知道有任何其他接口可以获取相同的数据。另外,fuser
、lsof
、netstat
以及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