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

Posted

技术标签:

【中文标题】如何获取进程监听的端口?【英文标题】:How to obtain ports that a process in listening on? 【发布时间】:2011-02-28 13:16:05 【问题描述】:

如何使用 python 获取进程正在侦听的端口?进程的pid是已知的。

【问题讨论】:

【参考方案1】:

你可以使用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')]
>>>

【讨论】:

谢谢。 psutil 是一个很好的模块。但唯一的问题是使用该模块需要先安装它。并且安装 psutil 需要安装 gcc 和 python 头文件。所以使用 psutil 的项目会很难安装。 psutil 需要 gcc,因为它包含需要编译的 C 代码。我不会说它很难安装,尤其是在 Linux 上。例如,在 Ubuntu 上,您只需要“apt-get install python-dev”和“pip install psutil”就可以了。【参考方案2】:

我的回答分为两部分:

1.获取shell中的信息

对于第一部分,netstat 可以,但我更喜欢使用lsof,因为它可以用来提取更多信息和简洁的列表。使用的确切选项可能会因您的操作系统、内核和编译选项而异,但我相信您想要这样的东西:

lsof -a -p23819 -i4

23819 是您要选择的 PID,i4 表示所有 IPv4 套接字(尽管您可能需要 i6 用于 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]

希望这会有所帮助!

【讨论】:

【参考方案3】:

如果您不想解析诸如 netstat 或 lsof 之类的程序的输出,则可以通过 /proc 文件系统尝试查找有关其中文件的文档。 /proc/<pid>/net/tcp 可能对您来说特别有趣。当然,这些文件的格式可能会在内核版本之间发生变化,因此通常认为解析命令输出更可靠。

【讨论】:

【参考方案4】:

您可以使用netstat -lnp,最后一列将包含 pid 和进程名称。在 Python 中,您可以解析此命令的输出。

【讨论】:

【参考方案5】:

没有提到的一件事。 python 中的大多数端口应用程序都采用命令行参数。您可以解析 /proc/pid/cmdline 并解析出端口号。这避免了在具有大量连接的服务器上使用 ss 或 netstat 的巨大开销。

【讨论】:

以上是关于如何获取进程监听的端口?的主要内容,如果未能解决你的问题,请参考以下文章

linux shell编程 根据端口获取进程pid 直接用命令netstat -anp grep 端口号 在shell中如何获取PID?

如何在linux中获取进程或端口网络带宽使用情况

如何在 C# 中获取打开端口的进程名称?

如何以编程方式获取正在侦听某个端口的进程的 pid?

node.js集群模块如何允许多个子进程监听同一个端口?

工作中常用到的Linux命令操作