查看Linux服务器端口是否被占用,最核心的工具是 ss、netstat 和 lsof 这三个命令,ss 是现阶段系统自带且效率最高的选择,优先用它就够了。
为什么你会在意端口被占用这件事
我们做服务器运维的,基本都遇到过这种情况:高高兴兴部署一个服务,结果启动时直接报错,提示 Address already in use,也就是端口被别的进程占用了,更隐蔽的情况是,服务确实启动成功了,但对外访问总是失败,一查才发现端口被一个不知名的旧进程悄悄霸占着。
针对“怎么查看linux服务器的网络端口被占用”这个需求,很多刚入行的朋友第一反应是去装一堆监控工具,其实完全没必要,Linux系统本身就内置了强有力的排查工具,学会用好它们,比装任何第三方面板都直接,你需要掌握的不只是“知道哪个端口被谁占用”,还得具备一套完整的排查思路,这样才能在遇到实际问题时不慌。
查看端口占用最常用的基础命令对比
先把三个核心命令摆出来,我们看看它们的定位区别,行业共识认为,netstat 是老牌工具,但新系统上信息读取效率不如 ss 快,尤其是端口数量多的时候,差距会非常明显。
| 命令 | 特点 | 适用场景 |
|---|---|---|
ss |
从内核直接读取信息,速度快,输出简洁 | 日常排查首选,尤其是生产环境连接数多时 |
netstat |
传统命令,兼容性极强 | 老系统或已习惯此命令的运维场景 |
lsof |
能精准定位占用端口的具体进程PID和名字 | 需要直接杀掉占用进程时非常方便 |
以下是具体的查看方法,包括最基础的命令格式和输出解读。
用ss命令快速找出占用端口的进程
如果你用的是CentOS 7以上或者Ubuntu 18.04以上的系统,直接执行 ss -lntp,你就能看到当前系统所有监听的TCP端口和对应的进程名,如果觉得输出太多,想精准查询某个端口,例如8080,命令可以写成这样:
ss -lntp | grep 8080
注意,最后的 p 参数是显示进程信息的关键,不加它你看不到PID和进程名字。
用lsof命令精准锁定端口所属程序
lsof这个命令强大在直觉性上,你问的是“谁占用了我在意的端口”,它就直接把进程给你揪出来,用法如下:
lsof -i:8080
执行后会直接展示该端口对应的进程名称、PID、用户以及连接状态,如果端口没被占用,这条命令不会有任何输出,相比用 ss 输出大段信息再过滤,lsof 在定位已知端口的场景下确实效率更高。
需要留意的是,如果你是在普通用户下执行 ss -p 或者 lsof -p,可能遇到权限不足,看不到进程名,这时候在命令前加上 sudo 再次执行即可。
如何根据端口号查询对应的进程PID
知道了端口占用,下一步往往就需要处理,有时候你拿到的是一个端口号,但想知道是谁在用,我们可以直接带着端口号去查PID。
sudo netstat -tunlp | grep :8080 sudo ss -tunlp | grep :8080
执行后会看到类似 pid=12345 的信息,这就是占用端口的进程PID,紧接着我们可以用 ps 命令查看这个进程的详细信息:
ps -ef | grep 12345
或者用更直观的 ps -p 12345 -o comm= 直接命令进程的名字,整个查询链路就是端口 -> PID -> 进程名,思路非常清晰。
实际排查场景:怎么查看linux端口被哪个进程占用并释放
上面讲的是基础命令,但实际工作中遇到的问题往往更综合,下面结合一个常见的实战场景,讲讲当端口被占用后完整的处理步骤。
场景复现与问题定位
假设你在一台刚接手ECS云服务器上部署Nginx,执行启动命令时却被告知80端口被占用了,这时候不必急着重启服务器或者盲目改端口,我们先按以下步骤走一遍排查流程:
-
执行
sudo lsof -i:80,查看对应的进程ID(PID)和进程名称。 -
如果输出显示有一个名为
httpd的进程占用了80端口,这就说明这台机器上原本已经装过Apache了。 -
用命令
ps -ef | grep httpd确认这个进程的启动路径和父进程信息,判断是系统自带的服务还是业务需要。
根据结果决定处理方案
你会发现,不同的情况采取的应对措施是完全不同的,比如查询下来发现是云监控的Agent进程挂在某个端口上,那处理方式就和处理残留的旧服务进程完全不同,这里要记住一个原则:不要盲目kill进程,先确认这个进程是不是当前业务需要的,否则可能导致不可用故障。
如果确认进程可以关闭,那么执行:
sudo kill 12345
如果普通kill杀不掉,说明可能是僵死进程,强制执行:
sudo kill -9 12345
这就是从“查看端口占用”到“解决端口占用”的全过程。
深入理解端口状态的细节与隐藏的问题
很多新手查完端口占用就结束了,但如果想要处理得更专业,了解状态变化很重要,我们用 ss -tanp 看到的不仅有监听状态(LISTEN),还有大量的 TIME_WAIT、CLOSE_WAIT 等连接状态。
- LISTEN:表示有进程在正常监听这个端口,对外提供服务。
- TIME_WAIT:主动断开连接的一方留下的状态,一般会自动消失,出现大量TIME_WAIT属于正常现象,意味着有大量短连接。
- CLOSE_WAIT:表示连接的被动关闭方没有正常关闭socket,如果这个状态堆积,大概率和业务代码没释放连接有关,系统层面很难处理,需要排查代码漏洞。
如果在排查中发现一个端口既没有进程占用,又提示端口被占用,这时候需要看看是不是同一台机器上存在多个网络命名空间,或者是不是防火墙做了端口转发,一般遇到这类情况,用 iptables -t nat -L -n 查看一下转发规则就好。
端口排查进阶技巧与经验分享
基础的端口查看是入门,进阶的经验才是让你少走弯路的法宝。
理解IP地址与端口的绑定关系
端口不只是“0-65535”的数字,它总是和IP地址绑定在一起的,执行 ss -lnt 时你会看到 0.0.0:80 和 :80 的区别。0.0.0 表示所有IPv4地址都可以通过该端口访问,而 0.0.1:8080 则代表只有本机可以访问,外网无法通过该IP连接。
熟练掌握组合式查询技巧
单独用命令显得呆板,组合起来效率才高,比如用 watch -n 1 'ss -lntp | grep 8080' 持续监控端口状态的变化,再比如查看大量TIME_WAIT端口占用了多少资源,可以执行:
ss -s
这条命令可以总览当前系统TCP/IP连接的整体统计情况,是面向全网状态查询的利器,能帮你快速判断系统是否负载过高。
关于防火墙对端口的影响
很多时候业务起不来,去查端口,发现端口确实在监听,但外部就是访问不通,这类场景尤其常见于云服务器,这和你是否安装了安全组关系很大,在本地执行 ss -lntp 看到监听,不代表对方网络可达,你需要检查云平台的安全组策略或者服务器内部的 firewalld、ufw 防火墙是否放行了该端口。
查看占用端口时常见问题快问快答
在实际操作中,大家总会遇到一些细节边角的问题,这里列举几个最高频的疑问,集中说明一下。
问:为什么我执行 lsof -i:8080 没有返回任何信息?
答:最常见的原因是这个端口确实没有被任何进程监听,另一种可能是当前登录用户的权限较低,看不到其他用户的进程,执行时建议加上 sudo,还有一种情况是端口处于非监听状态,比如被动连接进来正在建立中的TCP连接,用 ss -t 来查看所有状态的连接会更为精准。
问:为什么重启服务器端口还是被占用?
答:这说明占用该端口的服务可能设置了开机自启,或者有进程在系统层面常驻,你通过 ss -lntp 查到PID后,可以用 systemctl status PID 或 ls -l /proc/PID/exe 来定位具体的服务名称,然后通过 systemctl disable 服务名 来永久关闭它,如果通过 /proc 目录定位不到具体服务,大概率是配置了动态脚本,需要检查 rc.local 或者 crontab 配置。
问:如何一次性查看多个端口的占用情况?
答:lsof 命令支持直接写多个端口,格式为 lsof -i:80 -i:443,也可以先写好一系列端口号到配置文件里,配合脚本循环执行读取,但如果仅是为了快速看系统所有监听端口,建议直接用 ss -tulnp 一次性列出所有结果,输出中配有进程名,比单纯查几个端口获取的信息更全面,在大量服务器上批量排查时,这个命令配合循环脚本能明显提升效率,这也是业内比较推荐的管理思路。
整体来看,查看Linux服务器端口占用并不复杂,核心就是掌握 ss -lntp 和 lsof -i:端口号 这两个指令,并把 PID、进程名、监听状态 这三个要素串联起来,在实际的服务器运维排查中,你只要按照“先查端口状态,再对进程,最后决定处置”的顺序去执行,绝大多数端口冲突问题都能在几分钟内定位,遇到端口被占用时,优先确认业务归属再动手清理,才是稳妥的做法。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/794245.html


