作为一名在Linux运维领域摸爬滚打多年的老兵,我深知在日常工作中,排查网络连接、定位服务故障最常遇到的场景就是搞清楚“哪个进程在占用哪个端口”。这几乎是每个Linux用户从入门到精通的必经之路。本文我将结合自己的实操经验,系统地为大家梳理查看进程端口的各种方法和技巧,希望能帮你在遇到类似问题时,能够快速定位、从容解决。
如何查看端口占用情况
当我们在启动一个服务,比如Nginx或者Tomcat时,最怕看到的就是“Address already in use”的报错。这时候,第一步就是要搞清楚当前系统里端口的使用状态。最经典也最通用的命令就是netstat -tulpn。这个命令会列出系统中所有正在监听的TCP和UDP端口,并且会显示对应的进程PID和程序名称。

执行这个命令后,你会看到类似这样的输出:tcp 0 0 0.0.0.0:22 0.0.0.0:<strong> LISTEN 1234/sshd。这代表PID为1234的sshd进程正在监听所有网卡的22号端口。通过观察Local Address列,你可以快速找到任何一个端口是否被占用,以及被谁占用,是排查端口冲突的第一步。
根据端口号查找进程PID
有时候我们明确知道是哪个端口出了问题,比如80端口无法访问,想快速知道是哪个web服务在背后监听。这时候可以直接用lsof -i:端口号这个组合。比如lsof -i:80,这条命令会瞬间列出所有打开80端口的进程信息,包括PID、进程名、进程所有者等,非常直观。

如果你没有安装lsof,系统里通常也会有备选方案。可以借助netstat配合文本处理工具grep来实现相同的目标,命令是netstat -tulpn | grep :80。通过管道符将netstat的输出传递给grep,过滤出包含“:80”的行,你同样能从最后一列解析出占用80端口的PID和程序名,简单又有效。
查看进程打开了哪些端口
运维场景中经常需要逆向排查,也就是手里拿着一个进程的PID,想知道它到底开了哪些门(端口)在对外提供服务。这可以通过lsof -p PID来实现。这个命令会列出该PID进程打开的所有文件,因为Linux世界里一切皆文件嵌入式linux,网络连接也是一种文件描述符。在输出中过滤带有“IPv4”或“IPv6”以及“LISTEN”状态的行,就能清晰地看到该进程监听的端口。

另一个更聚焦的命令是netstat -tulpn | grep PID。当你已经知道进程PID,比如从top命令中得知某个应用PID是1234,直接执行netstat -tulpn | grep 1234,就能快速筛选出这个进程正在监听和建立的网络连接状态,包括本地端口和远程地址,让你对这个进程的网络活动一目了然。
netstat命令查看端口详解
netstat是Linux系统中网络排查的瑞士军刀。它的参数虽然多linux 删除文件,但查看端口时,记住-tulpn这五个字母的组合基本就能覆盖90%的需求。-t代表显示TCP端口,-u代表显示UDP端口,-l代表只显示正在监听的端口,-p是显示对应的进程PID和名称,-n则是用数字形式显示地址和端口,避免反向解析域名导致速度变慢。
熟练使用netstat的关键在于看懂它的输出列。比如State列显示的“LISTEN”表示该端口正在等待连接,“ESTABLISHED”表示已经建立的连接。而Foreign Address如果显示为0.0.0.0:,表示它接受来自任何IP的连接。通过这些状态和地址信息,你可以判断一个服务是否正常启动,以及是否有外部机器正在连接它。

lsof命令查看端口使用
如果说netstat是系统自带的标配,那么lsof(List Open Files)则是一个功能更加强大的扩展工具。在排查端口时,最常用的就是lsof -i。-i选项后面可以跟很多参数来精确过滤,比如lsof -i tcp只查看TCP协议,lsof -i :22只查看22号端口。执行后,你会看到COMMAND、PID、USER、FD、TYPE、DEVICE、SIZE/OFF、NODE、NAME等信息,其中NAME列就包含了IP和端口。
lsof的强大之处在于它不仅能看监听端口,还能看当前的连接。比如你想知道有没有人正在连接你的数据库端口,可以用lsof -i @client_ip或者lsof -i :3306来查看。当系统出现大量不明连接时,lsof能帮你快速定位到具体的进程,是排查安全问题和性能问题的得力助手。
端口被占用了怎么解决

当你确定端口被占用后,解决方法通常有两种。第一种是结束占用端口的进程,这适用于确定该进程是无用或可以重启的情况。使用kill -9 PID命令可以强制终止进程,然后你就可以重新启动自己的服务来接管这个端口了。但操作前一定要确认这个进程是否可以杀掉,比如sshd或数据库进程,贸然杀死会导致服务中断。
第二种方法则是修改你自己的服务配置文件,让它监听其他未被占用的端口。比如将Nginx的监听端口从80改为8080,或者将MySQL的3306端口改为3307。这种方法更为稳妥,可以避免影响系统上其他正在运行的服务。修改配置文件后,记得重启你的服务使配置生效linux 查看进程端口,再用netstat -tulpn验证新端口是否已正常监听。
你在实际运维工作中linux 查看进程端口,遇到过最奇葩的端口占用情况是什么?是哪个进程让你印象深刻?欢迎在评论区分享你的故事,如果觉得本文对你有帮助,请点赞并分享给更多需要的朋友。
