如何获取一个进程在监听的端口?

如何获得进程使用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的大量开销。