用root,打开其他进程套接字并用python获取tcp_info?

时间:2013-10-09 02:22:22

标签: python linux sockets tcp

我正在尝试制作TCP性能监控工具,我要提取的主要值是tcpi_rtt from tcp_info

对于进程内套接字,可以像python

中的getsockopt(socket.SOL_TCP, socket.TCP_INFO)一样获得

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

是否有任何通用方法可以在linux上查看其他进程的tcp_info?

1 个答案:

答案 0 :(得分:0)

我所知道的没有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,对应于带有inode编号31159的套接字:

# ls -lah /proc/31117/fd/11
lrwx------ 1 root root 64 Dec 10 19:08 /proc/31117/fd/11 -> socket:[31159]

您无法“打开”/ proc / pid / fd / 4等套接字文件的原因是因为这些都是指向不存在的文件的链接。您可以从中获取的唯一信息是套接字的名称(inode编号)。