如何获得进程使用python监听的端口? 该过程的PID是已知的。
我的答案有两个部分:
1.获取shell中的信息
对于第一部分, netstat
会工作,但我更喜欢使用lsof
,因为它可以用来提取更丰富和简洁的列表。 确切的选择使用可能会有所不同,根据您的操作系统,内核和编译选项,但我相信你想这样的事情:
lsof -a -p23819 -i4
其中, 23819
是您正在选择的PID,而i4
表示所有IPv4套接字(尽管您可能需要i6
for IPv6,视情况而定)。 从那里,你可以通过grep管道来选择只有监听套接字。
lsof -a -p23819 -i4 | grep LISTEN
(在lsof
4.82版中,你可以另外使用-sTCP:LISTEN
标志而不是grep
来选择监听套接字,尽管这个选项在版本4.78中似乎没有提供)
2.从Python调用lsof
您应该能够调用lsof
并使用subprocess
模块从Python读取输出,如下所示:
from subprocess import Popen, PIPE p1 = Popen(['lsof', '-a', '-p23819', '-i4'], stdout=PIPE) p2 = Popen(["grep", "LISTEN"], stdin=p1.stdout, stdout=PIPE) output = p2.communicate()[0]
希望这可以帮助!
你可以使用psutil :
>>> import psutil >>> p = psutil.Process(2549) >>> p.name() 'proftpd: (accepting connections)' >>> p.connections() [connection(fd=1, family=10, type=1, local_address=('::', 21), remote_address=(), status='LISTEN')]
…要筛选侦听套接字:
>>> [x for x in p.get_connections() if x.status == psutil.CONN_LISTEN] [connection(fd=1, family=10, type=1, local_address=('::', 21), remote_address=(), status='LISTEN')] >>>
如果你不想分析像netstat或lsof这样的程序的输出,你可以通过/ proc文件系统来寻找文件,然后尝试找到其中的文件。 /proc/<pid>/net/tcp
可能对你特别有意思。 当然,这些文件的格式可能会在内核版本之间改变,所以解析命令输出通常被认为是更可靠的。
您可以使用netstat -lnp
,最后一列将包含pid和进程名称。 在Python中,你可以解析这个命令的输出。
有一件事没有提到。 python中的大多数端口应用程序都有一个命令行参数。 你可以解析/ proc / pid / cmdline并解析出端口号。 这避免了在连接数量很多的服务器上使用ss或netstat的大量开销。