• 微信
    咨询
    微信在线咨询 服务时间:9:00-18:00
    纵横数据官方微信 使用微信扫一扫
    马上在线沟通
  • 业务
    咨询

    QQ在线咨询 服务时间:9:00-18:00

    选择下列产品马上在线沟通

    纵横售前-老古
    QQ:519082853 售前电话:18950029581
    纵横售前-江夏
    QQ:576791973 售前电话:19906048602
    纵横售前-小李
    QQ:3494196421 售前电话:19906048601
    纵横售前-小智
    QQ:2732502176 售前电话:17750597339
    纵横售前-燕子
    QQ:609863413 售前电话:17750597993
    纵横值班售后
    QQ:407474592 售后电话:18950029502
    纵横财务
    QQ:568149701 售后电话:18965139141

    售前咨询热线:

    400-188-6560

    业务姚经理:18950029581

  • 关注

    关于纵横数据 更多优惠活动等您来拿!
    纵横数据官方微信 扫一扫关注官方微信
  • 关闭
  • 顶部
  • 您所在的位置 : 首页 > 新闻公告 > 云服务器如何查看端口占用?

    云服务器如何查看端口占用?

    云服务器上部署新应用的时候,最让人恼火的报错之一就是“端口已被占用”。明明服务配置都写好了,一启动却提示地址冲突,网站访问不了,接口调不通。端口就像是服务器的门牌号,每个服务都得绑定一个唯一的端口才能正常工作,一旦被占用了,新服务就进不去,老服务也可能跟着出问题。所以掌握查看端口占用的方法,是排查这类问题的基本功。

    Linux系统下查看端口占用的常用方法

    对于Linux云主机来说,netstat是最经典的工具。执行netstat -tunlp,系统会列出所有正在监听的TCP和UDP端口,以及每个端口对应的进程ID和程序名称。输出信息里包含协议类型、接收队列和发送队列、本地地址和端口、外部地址以及状态。其中本地地址那一列如果显示0.0.0.0:80,表示80端口正在监听所有网络接口上的连接请求;如果显示127.0.0.1:3306,则表示3306端口只允许本机访问。

    如果输出内容太多,想针对某个特定端口做精确查找,可以用grep来过滤。比如要查看8080端口是否被占用,执行netstat -tunlp | grep :8080,如果有输出结果,说明这个端口已经被某个进程占用了,输出里会显示占用该端口的进程ID和程序名。如果没有任何输出,说明8080端口目前是空闲的,可以放心使用。

    netstat虽然好用,但在连接数很大的服务器上执行速度会变慢。这时候更推荐使用ss命令。ss -tunlp的作用和netstat类似,但ss直接从内核获取信息,效率高出不少。尤其在端口占用排查场景中,ss的响应速度明显更快,对于生产环境的影响也更小。比如用ss -tunlp | grep :3306可以快速确认MySQL是否正常监听在3306端口上。

    除了查看端口被谁占用之外,有时候还需要反向查某个进程到底开了哪些端口。这时候可以用lsof命令。lsof -i :端口号可以查看指定端口被哪个进程占用,而lsof -i -a -p 进程ID可以列出某个进程打开的所有网络连接。lsof的强大之处在于它能同时显示进程名、PID和用户,信息维度比netstat更丰富。

    实际操作中有一种常见场景:明明用netstat或ss查看到某个端口没有进程在监听,但启动服务时仍然报端口被占用。这种情况往往是因为操作系统还没有完全释放该端口的资源,端口仍处于TIME_WAIT状态。TIME_WAIT是TCP连接关闭后的一个过渡状态,默认会持续几十秒到几分钟不等。在这个窗口期内,端口是不能被重新绑定的。遇到这种情况不用着急,等一会儿再试就好了,或者调整系统的TCP超时参数来缩短等待时间。

    Windows系统下查看端口占用的方法

    Windows云主机查看端口占用就更直观了。打开命令提示符,执行netstat -ano,系统会列出所有网络连接和监听端口,最后一列显示的是进程ID。如果想查找特定端口,可以用netstat -ano | findstr :8080这样的命令组合来筛选。找到占用端口的进程ID之后,打开任务管理器,切换到详细信息选项卡,按PID列排序,就能定位到对应的进程名称了。

    Windows还有一种更友好的方式——资源监视器。按Win+R打开运行窗口,输入resmon回车,切换到网络选项卡,在“侦听端口”部分可以看到所有正在监听的端口及其对应的进程。这个界面的好处是完全图形化的,不需要记命令,而且还能看到每个进程的网络活动细节。

    如果安装了Windows版的lsof工具,也可以使用类似Linux的命令行体验。不过对于大多数Windows运维人员来说,netstat加任务管理器已经足够应付日常排查需求了。

    端口被占用之后的处理思路

    找到占用端口的进程之后,下一步就是决定怎么处理了。如果这个进程确实不该运行,或者是一个僵尸进程,可以在确认无误后结束它。Linux下用kill命令加进程ID即可终止,比如kill -9 1234强制结束PID为1234的进程。Windows下可以在任务管理器中选中进程后点击结束任务。

    但在动手结束进程之前,一定要确认这个进程到底是什么。有时候占用80端口的可能是合法的Web服务器,新的服务想用80端口就得考虑换端口或者协调配置。盲目kill掉正在运行的生产服务,后果可能比端口冲突本身更严重。

    还有一个小技巧值得分享:如果某个端口既没有被netstat列出,lsof也查不到,但服务就是起不来,可以检查一下防火墙或者安全组策略是否屏蔽了该端口。有些云服务商在控制台层面会限制特定端口的入站流量,这种限制不会体现在操作系统内部,需要用外部扫描工具才能发现。

    实际案例:端口被占用的曲折排查

    有一个做游戏私服的朋友遇到过这么一件事:服务器重启之后,游戏服务端程序怎么也启动不了,一直报“端口已被占用”。执行netstat -tunlp看了一下,目标端口并没有被任何进程监听。又用ss查了一遍,还是没有。当时第一反应是怀疑程序有bug,但同样的安装包在测试环境就正常。

    折腾了半个多小时,最后用lsof -i把所有网络连接都列出来仔细看,发现有一个处于TIME_WAIT状态的连接,虽然已经关闭但端口还没释放。由于这个游戏服务端对端口绑定的要求比较严格,遇到TIME_WAIT就直接报错退出。解决方式其实很简单:调整了系统的net.ipv4.tcp_tw_reuse参数,允许在TIME_WAIT状态下重用端口,问题就迎刃而解了。

    总结

    查看端口占用这件事,说起来简单,做起来却有很多门道。Linux下netstat和ss双剑合璧基本能覆盖所有场景,配合lsof做精准定位,再加上grep过滤,效率很高。Windows下netstat加任务管理器也是经典组合。遇到端口冲突时,先查谁占用了它,再根据实际情况决定是终止进程、更换端口还是调整系统参数。记住一个原则:在kill进程之前一定要弄清楚对方是谁,避免误伤生产服务。掌握了这套方法,端口占用的问题就不再是难题了。



    最新推荐


    微信公众帐号
    关注我们的微信