用其他python根进程和其他进程打开?

2024-06-25 07:15:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试制作一个TCP性能监视器工具,我要提取的主要值是tcpi_rttfrom tcp_info

对于进程内套接字,这可以像python中的getsockopt(socket.SOL_TCP, socket.TCP_INFO)获得

但是外部过程呢?对于TCP连接,在python的root下,我尝试os.open(/proc/XXXX/fd/4)套接字inode,但失败了OSError: [Errno 6] No such device or address:。此方法仅适用于常规fd或stdin/stdout。在

在linux上有没有什么通用的方法可以窥探其他进程的tcp_信息?在


Tags: 工具方法info进程socket性能tcp监视器
1条回答
网友
1楼 · 发布于 2024-06-25 07:15:44

据我所知,没有任何python工具可以满足您的要求,也没有一种简单的方法可以让我自己解析proc目录。因此,您可以自己实现ss command的纯python版本(或者至少了解它如何根据/proc/<;pid>;/net/*中的信息计算RTT),或者解析其输出。我更像是一个bash的人,所以这是我拼凑起来得到的(RTT,PID)对列表:

#!/usr/bin/python
from subprocess import check_output as co

co("ss -tp > ss.out", shell=True)
rtts = co("cat ss.out | grep ESTAB | awk '{print $4}' | xargs -I {} ss -i 'src {}' | grep \"rtt:\" | awk '{print $4}' | cut -d : -f 2 | cut -d / -f 1", shell=True)
pids = co("cat ss.out | grep ESTAB | awk '{print $6}' | cut -d , -f 2", shell=True)

print zip(rtts.split('\n'), pids.split('\n'))

在ss命令中,-t表示显示TCP连接,-p表示打印进程(PID)信息。使用-e选项,您还可以获得inode编号,您可以使用它来确定/proc/XXXX/fd/中的文件描述符编号。例如,在我的机器上运行进程31117,文件描述符编号为11,对应于索引节点编号为31159的套接字:

^{pr2}$

不能“打开”像/proc/pid/fd/4这样的套接字文件的原因是因为这些都是指向不存在的文件的链接。从它们获得的唯一信息是套接字的名称(inode number)。在

相关问题 更多 >