端口被占用别急着杀进程:用 lsof 三步定位谁在监听
启动服务时,端口已被占用是最常见的报错之一。不少人第一反应是找出 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 当习惯,它会跳过清理,容易造成数据未落盘、锁文件残留。生产环境更要先查部署记录、问负责人,确认端口是否被监控或网关依赖。宁可多问一句,也不要误杀关键进程。
- 点赞
- 收藏
- 关注作者
评论(0)