端口被占用别急着杀进程:用 lsof 三步定位谁在监听

举报
yd_227538180 发表于 2026/11/04 10:19:52 2026/11/04
【摘要】 启动服务时,端口已被占用是最常见的报错之一。不少人第一反应是找出 PID 直接杀掉,服务虽然起来了,却可能误杀数据库、消息队列或同事正在调试的进程。稳妥的做法是先定位、再判断、最后动手。第一步:用 lsof 查监听者。假设端口是 8080,执行 lsof -i :8080。输出中的 COMMAND、PID、USER 说明程序身份,NAME 一栏的 *:8080 表示监听所有网卡。没有输出时,...

启动服务时,端口已被占用是最常见的报错之一。不少人第一反应是找出 PID 直接杀掉,服务虽然起来了,却可能误杀数据库、消息队列或同事正在调试的进程。稳妥的做法是先定位、再判断、最后动手。

第一步:用 lsof 查监听者。假设端口是 8080,执行 lsof -i :8080。输出中的 COMMAND、PID、USER 说明程序身份,NAME 一栏的 *:8080 表示监听所有网卡。没有输出时,先核对端口号,再确认进程是否在容器或另一个网络命名空间里。想看全部监听端口,可用 lsof -i -P -n,-P 不解析服务名,-n 不解析主机名,输出更快。

第二步:按 PID 查进程与启动命令。拿到 PID 后先执行 ps -o pid,ppid,user,cmd -p PID,看程序是什么、由谁启动、命令行参数是什么。只看 java、python 这类进程名容易误判,只有看到 jar 包路径、配置文件或工作目录,才能确认它是测试服务还是线上服务。还可以用 ls -l /proc/PID/exe 和 /proc/PID/cwd 交叉确认可执行文件与工作目录。如果是自己留下的旧实例,处理就简单;如果是系统或他人服务,必须先确认归属。

第三步:用 ss 交叉验证。执行 ss -tlnp | grep 8080,其中 -t 是 TCP,-l 是监听,-n 不解析名称,-p 显示进程。把 ss 的 PID 与 lsof 的 PID 对上,就能排除看错端口或协议的情况;UDP 则改用 ss -ulnp。两者不一致时,重新核对端口和协议,以能复现的结果为准。

确认无用后再处理。优先用 systemctl stop 或程序自带的优雅退出,让进程关闭连接、落盘数据。必须 kill 时先用 kill PID 发送默认 SIGTERM,给进程清理时间;只有无响应且确认可丢弃现场时,才考虑更强制的手段。不要把 kill -9 当习惯,它会跳过清理,容易造成数据未落盘、锁文件残留。生产环境更要先查部署记录、问负责人,确认端口是否被监控或网关依赖。宁可多问一句,也不要误杀关键进程。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。