端口被占用别急着杀进程:用 ss 三步找到真正的占用者
【摘要】 服务起不来,日志里一句 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)