端口被占用别急着杀进程:用 ss 三步找到真正的占用者

举报
yd_272148905 发表于 2026/11/02 06:24:22 2026/11/02
【摘要】 服务起不来,日志里一句 Address already in use,很多人的第一反应是换个端口绕过去。端口大概率还会再撞回来,不如花一分钟把占用者找出来。 第一步:看谁在监听老命令 netstat -tlnp 在很多新系统上已经不预装了,现在推荐用 ss:ss -tlnp | grep :8080输出里 users:(("java",pid=12345,fd=21)) 这一段就是答案:进程...

服务起不来,日志里一句 Address already in use,很多人的第一反应是换个端口绕过去。端口大概率还会再撞回来,不如花一分钟把占用者找出来。

第一步:看谁在监听

老命令 netstat -tlnp 在很多新系统上已经不预装了,现在推荐用 ss:

ss -tlnp | grep :8080

输出里 users:(("java",pid=12345,fd=21)) 这一段就是答案:进程名、PID、文件描述符都在。-t 是 TCP,-l 是监听状态,-n 不解析域名和服务名(快很多),-p 显示进程(需要 root 才能看到别人的进程,所以通常加 sudo)。

第二步:确认这个进程是谁

拿到 PID 先别急着 kill,先看它是什么时候起的、谁起的、命令行是什么:

ps -fp 12345
cat /proc/12345/cmdline | tr '\0' ' '

十有八九是上次没关干净的调试进程,或者某个同事起的测试服务。确认是僵尸进程再动手:

kill 12345        # 先温和退出
kill -9 12345     # 等几秒还没退,再强杀

直接上来就 -9 有两个坏处:进程没机会释放锁和刷盘,还可能被 systemd 立刻拉起来,你会以为杀错了。

第三步:如果它杀不掉或者又活了

进程被杀后端口马上又被占用,基本是守护进程在拉活:

systemctl status 12345    # 直接传 PID,能反查属于哪个服务

顺藤摸瓜找到服务名,用 systemctl stop 停掉才是治本。如果是 Docker 容器占的,ss 里看到的进程名会是 docker-proxy,改用 docker ps 按端口映射找容器。

小结

排查顺序记住一条线:ss -tlnp 找 PID → ps 看身份 → 先 kill 后 kill -9 → 反复复活就查 systemd 或容器。比起换端口,这套动作一分钟搞定,还顺带搞清了机器上到底跑着什么。

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

评论(0)

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

全部回复

上滑加载中

设置昵称

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

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

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