查看端口占用并结束进程,Linux查看端口占用命令

题图来自Unsplash,基于CC0协议
导读
在日常开发和运维工作中,端口占用问题是最常见的网络故障之一。当一个端口被某个进程占用时,其他程序尝试绑定同一端口就会失败,通常表现为“地址已在使用”或“端口已被占用”的错误提示。以下我们将从 Windows 和 Linux 两个主流操作系统出发,详细介绍如何查看端口占用、找到对应的进程并结束它,最后还会梳理端口占用的常见原因以及如何确认端口已被释放。
一、Windows 下查看端口占用
在 Windows 系统中,最经典和通用的命令是 netstat。它能够显示当前所有网络连接、监听端口以及对应的进程标识符(PID)。打开命令提示符(CMD)或 PowerShell,运行以下命令:
netstat -ano | findstr :端口号
参数说明:-a 显示所有连接和监听端口,-n 以数字形式显示地址和端口号,-o 显示关联的进程 PID。例如要查看 8080 端口是否被占用,可以输入:
netstat -ano | findstr :8080
返回结果中会列出该端口的协议(TCP/UDP)、本地地址、状态以及最后一列的 PID。如果该端口被占用,状态通常是 LISTENING(监听)或 ESTABLISHED(已建立连接)。
获得 PID 之后,可以通过任务管理器或者命令行工具来查找具体进程。在任务管理器中,切换到“详细信息”选项卡,找到对应 PID 的进程名称即可。如果使用命令行,可以用 tasklist 命令:
tasklist | findstr PID号码
二、Windows 下结束占用端口的进程
找到占用端口的进程后,可以使用 taskkill 命令强制终止。命令格式为:
taskkill /PID 进程PID /F
/F 表示强制结束进程。例如要结束 PID 为 12345 的进程,执行:
taskkill /PID 12345 /F
如果进程名称已知,也可以直接通过名称杀死(但不推荐,因为可能误杀同名进程):
taskkill /IM 进程名称.exe /F
执行后系统会提示“成功: 已终止 PID 为 xxx 的进程”,此时该端口就被释放了。
三、Linux 下查看端口占用
Linux 下查看端口占用的方法更丰富,最常用的是 lsof 和 ss 命令。lsof(list open files)可以列出当前系统打开的所有文件,在 Linux 中网络套接字也被视为文件。使用以下命令查看指定端口的占用情况:
lsof -i :端口号
例如查看 8080 端口:
lsof -i :8080
输出会显示进程的 PID、进程名称、文件描述符以及协议等信息。如果提示命令未找到,需要安装 lsof(通常发行版默认包含,若没有则通过包管理器安装,如 apt install lsof 或 yum install lsof)。
另一个快速工具是 ss,它是 netstat 的现代替代品,效率更高:
ss -tlnp | grep :端口号
-t 显示 TCP,-l 显示监听中的端口,-n 显示数字地址,-p 显示进程信息。输出会列出关联的 PID 和进程名称。
如果系统中没有 lsof 和 ss,传统 netstat 命令也可以使用(需要安装 net-tools 包):
netstat -tlnp | grep :端口号
四、Linux 下结束占用端口的进程
得到 PID 后,使用 kill 命令终止进程。常用方式:
kill -9 PID号码
-9 表示发送 SIGKILL 信号,强制终止进程。也可以先尝试 kill PID(默认 SIGTERM),请求进程正常退出,如果无效再使用 -9。
例如要结束 PID 为 12345 的进程:
kill -9 12345
同样,也可以直接使用 lsof 结合管道一次性完成查找和杀死(但需谨慎,确保不会误杀其他进程):
lsof -ti :端口号 | xargs kill -9
-t 选项使 lsof 只输出 PID,配合 xargs 将 PID 传递给 kill 命令。
五、如何确认端口已被释放
结束进程后,我们需要验证端口确实已释放,才能确保其他程序可以正常绑定。验证方法很简单,重复执行之前的查看命令即可:
- Windows:再次运行
netstat -ano | findstr :端口号,如果没有任何输出,说明该端口已经不在监听状态。 - Linux:运行
lsof -i :端口号或ss -tlnp | grep :端口号,若无返回结果,表示端口已释放。
另外,也可以使用其他主机或工具尝试连接该端口(例如 telnet 127.0.0.1 端口号),如果连接被拒绝,同样说明端口已释放。但要注意,某些服务可能启动较慢,刚杀死进程后立即检查可能没问题,但若系统有自动重启策略,服务可能会立即重新绑定端口。
六、端口占用问题的常见原因
了解端口被占用的常见原因,有助于从根源上避免问题反复出现:
- 服务未正确关闭:最常见的情况是开发或测试过程中,启动了 HTTP 服务器(如 Tomcat、Node.js、Nginx)后,直接关闭了终端窗口而未优雅终止服务,导致进程在后台继续监听端口。
- 多个实例冲突:同一台机器上启动了多个相同服务的实例,例如同时启动了两个 Spring Boot 应用都使用 8080 端口。
- 系统服务或安全软件占用:某些系统服务(如 Windows 上的 World Wide Web Publishing Service、SQL Server)或安全软件(防火墙、杀毒软件)可能会占用特定端口。
- 残留进程:程序崩溃后,子进程或守护进程未被正确清理,仍然持有端口。
- 端口被其他应用程序抢占:例如 Skype、TeamViewer 等软件可能会随机占用一些常用端口。
- 防火墙或虚拟网络设备:某些虚拟网卡或 VPN 软件会绑定端口,造成实际服务无法绑定。
- 端口范围限制:在某些受限环境中,系统可能只允许特定端口范围,或者临时端口被耗尽(常见于大量短连接场景)。
解决端口占用问题的核心思路是:先定位占用端口的进程,然后根据实际情况决定是杀掉该进程、修改配置使用其他端口,还是排查该进程是否本就应该运行(例如系统服务)。如果确定某个端口必须被占用(如数据库端口),那么启动新服务时应选择不同的端口。
© 版权声明
本文由盾科技原创,版权归 盾科技所有,未经允许禁止任何形式的转载。转载请联系candieraddenipc92@gmail.com