ss、lsof、netstat、fuser 四件套实战
ss、lsof、netstat、fuser 四件套实战文章题图1读前导读1.1这篇文章讲什么这是一篇关于端口占用排查的完整实战指南。表面上看Address already in use只是一个很普通的报错但真正去追的时候会发现它背后牵涉到 socket、内核、systemd、容器、namespace 多种层次。这篇文章会从最基础的命令讲到复杂的幽灵进程场景再讲到 systemd 和游离进程共存的情况。读完你将能够应对 99% 的端口占用问题。1.2你会学到什么四个最常用的端口排查工具ss、lsof、netstat、fuser它们的适用场景、差异、坑点进程找不到时的 /proc 终极排查TIME_WAIT、幽灵进程、systemd restart loop、容器 namespace 四大疑难场景一份端口占用一键排查脚本1.3典型场景流程图先说结论“Address already in use”——这是每一个运维工程师都会遇到的经典报错。无论是启动一个 Web 服务、起一个数据库、还是部署一个 Gateway只要端口被占用错误信息就会无情地弹出来。然后你就会陷入一个熟悉的循环启动服务 → 报错端口被占用 → 用 netstat 查 → 找到一个 PID → 用 ps 查 PID → 找不到对应进程 → 怀疑人生 → 重启服务器 → 问题依然存在。这个剧本我演了无数遍。这篇文章把这几年积累的所有经验都整理出来。文章会从最基础的命令讲到复杂的幽灵进程场景再讲到 systemd 和游离进程共存的情况。2问题背景2.1典型场景假设你要启动一个 Gateway 服务监听在 18789 端口。你运行启动命令结果报错Error: listen tcp 0.0.0.0:18789: bind: address already in use服务启动失败。你需要找出谁在占用 18789 端口这个占用者是什么进程这个进程能不能安全杀掉杀掉之后如何让服务正常启动这就是典型的端口占用排查场景。2.2排查工具一览工具主要用途优点缺点ss查看端口监听最快、现代、默认安装输出信息较少netstat查看端口监听经典、输出友好已被 ss 取代lsof查看进程打开的文件信息最全需要 root 权限fuser查看使用文件/端口的进程可以直接杀进程信息不如 lsof 全/proc直接读取内核信息最权威操作复杂四件套工具对比3第一招使用 ss 命令ssSocket Statistics是netstat的现代替代品读取/proc/net直接获取信息速度比netstat快几个数量级。3.1基础用法# 查看所有 TCP 端口的监听状态ss -tlnp# 只查看特定端口ss -tlnp | grep 18789# 查看所有状态的连接包括 ESTABLISHED、TIME_WAIT 等ss -tnp# 查看 UDP 端口ss -ulnp参数说明-tTCP-uUDP-l只显示 LISTEN 状态-n不解析服务名显示数字端口-p显示进程信息3.2输出示例LISTEN 0 128 0.0.0.0:18789 0.0.0.0:* users:((openclaw-gatewa,pid281750,fd7))从输出中你可以读到协议LISTEN监听状态地址0.0.0.0:18789IPv4 所有地址的 18789 端口进程openclaw-gatewa(pid 281750)文件描述符fd 73.3进阶用法# 查看 IPv4 IPv6 监听ss -tlnp -A inet# 按进程名过滤ss -tlnp sport :18789# 查看进程所属的网络命名空间ss -tlnp -n netns# 显示 socket 详细信息包括内存、计时器等ss -tlnepi实战建议在生产环境中ss -tlnp是你应该第一反应使用的命令。它速度快、输出清晰、大部分 Linux 发行版都默认安装。ss 命令速查4第二招使用 lsoflsofList Open Files可以列出进程打开的所有文件包括网络连接。它是排查端口问题的瑞士军刀。4.1基础用法# 查看占用特定端口的进程lsof -i :18789# 查看 IPv4 端口lsof -i4 :18789# 查看 IPv6 端口lsof -i6 :18789# 同时查看协议类型lsof -i tcp:18789lsof -i udp:187894.2输出示例COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAMEopenclaw-g 281750 root 7u IPv4 1234567 0t0 TCP *:18789 (LISTEN)openclaw-g 281750 root 8u IPv6 1234568 0t0 TCP *:18789 (LISTEN)字段解读COMMAND命令名PID进程 IDUSER进程所属用户FD文件描述符7u表示 7 号 fdu 表示可读写TYPEsocket 类型IPv4/IPv6DEVICE设备号NODE协议和地址NAME连接信息4.3进阶用法# 查看进程打开的所有网络连接lsof -p 281750# 查看进程打开的所有文件lsof -p 281750 | head -30# 查看用户打开的网络连接lsof -u root -i# 反向查询根据 inode 找进程lsof -i 127.0.0.1# 持续监控lsof -i :18789 -r 5 # 每 5 秒刷新一次实战建议lsof是排查找不到进程问题的神器。当ss显示有进程占用但ps找不到时lsof往往能给你答案。lsof 字段解读5第三招使用 netstat虽然ss是新欢但netstat在很多老系统上仍然是默认工具。掌握它也很有必要。5.1基础用法# 查看所有监听端口netstat -tlnp# 查看特定端口netstat -tlnp | grep 18789# 查看所有连接包括非监听netstat -anp# 查看 UNIX 域套接字netstat -xlnp参数说明-tTCP-uUDP-lLISTEN 状态-n数字端口-p进程-a所有连接5.2输出示例tcp 0 0 0.0.0.0:18789 0.0.0.0:* LISTEN 281750/openclaw-gatcp 0 0 [::]:18789 [::]:* LISTEN 281750/openclaw-gw5.3注意事项# 如果 netstat 命令不存在需要安装# CentOS/RHEL:yum install -y net-tools# Ubuntu/Debian:apt-get install -y net-tools实战建议在写脚本或者文档时建议优先使用ss。但在 SSH 到老系统时先试试netstat也无妨。6第四招使用 fuserfuser可以显示使用某个文件/端口的所有进程并支持直接发送信号。6.1基础用法# 查看占用 18789 端口的进程fuser 18789/tcp# 查看详细信息fuser -v 18789/tcp# 直接杀死占用进程慎用fuser -k 18789/tcp# 发送特定信号fuser -k -TERM 18789/tcpfuser -k -KILL 18789/tcp # 等同于 -96.2输出示例18789/tcp: 281750只显示 PID简单直接。6.3进阶用法# 查看进程使用的所有文件fuser -v /var/log/openclaw/# 查看挂载点的占用fuser -mv /mnt/data# 命名空间级别fuser -m /mnt/data实战建议fuser -k是一键杀进程工具但慎用。在生产环境使用前务必确认这个进程可以杀。7终极招直接查 /proc当所有命令都找不到进程时那就只能直接读/proc了。7.1查看占用 18789 的进程# 找到占用 18789 端口的 socket inodecat /proc/net/tcp | awk $2 ~ /:4935$/ {print $10}# 18789 的十六进制是 49357.2反向查找# 根据 inode 找到进程find /proc -path */fd/* -exec ls -l {} \; 2/dev/null | grep socket:[1234567]7.3查看进程命令行# 根据 PID 查看完整命令行cat /proc/281750/cmdline | tr \0 # 查看进程状态cat /proc/281750/status# 查看进程启动时间ps -p 281750 -o lstart实战建议直接查/proc是核武器级别的方法。一般情况下用ss和lsof就够了但遇到诡异问题时这是最后的退路。8常见疑难场景8.1场景ss 显示有进程ps 找不到这是经典的幽灵进程问题。症状ss -tlnp | grep 18789# 输出users:((openclaw-gatewa,pid281750,fd7))ps -p 281750# 输出error: process ID list syntax error原因进程是 zombie 状态Z已死但未释放资源进程是 namespace 隔离的主机 ps 看不到进程在容器里ps 只能看到容器内的排查方法# 查看所有进程不限于当前会话ps auxf# 查看 zombie 进程ps -eo pid,ppid,stat,cmd | awk $3 ~ /Z/# 查看进程的父进程ps -o ppid -p 281750解决方法如果是 zombie找到父进程重启父进程如果是 namespace 问题进入对应 namespace如果是容器问题进入容器查看8.2场景端口被 TIME_WAIT 占用TIME_WAIT 状态机症状ss -tan | grep 18789# 输出TIME-WAIT 状态的连接一大堆原因服务刚刚关闭但 TCP 连接还在 TIME_WAIT 状态等待 2MSL 时间确保最后的 ACK 被对端收到。这个状态下端口虽然没人在用但内核不允许新进程绑定。解决方法# 方法 1等待 1-2 分钟推荐# 让 TIME_WAIT 自然消失# 方法 2开启 SO_REUSEADDR推荐在代码中处理# 允许绑定 TIME_WAIT 状态的地址# 方法 3调整内核参数不推荐net.ipv4.tcp_tw_reuse 1sysctl -p# 方法 4使用 SO_REUSEPORT应用层处理# 允许多个进程绑定同一端口负载均衡场景8.3场景systemd 一直在 restart loopsystemd restart loop 排查症状systemctl status openclaw-gateway# Active: activating (auto-restart) (Result: exit-code)# 状态: failed但实际上服务在用——某个游离进程占用了 18789 端口systemd 启动失败但又不停重启。排查方法# 1. 查看端口占用ss -tlnp | grep 18789# 2. 如果有游离进程杀掉它kill pid# 3. 等待端口释放ss -tlnp | grep 18789 # 确认无监听# 4. 重启 systemd 服务systemctl restart openclaw-gateway预防方法永远只通过 systemd 启动服务禁止直接运行xxx-daemon 定期巡检是否有游离进程8.4场景容器内端口被占用的错觉容器 namespace 隔离症状主机上ss -tlnp看不到占用容器内ss -tlnp看到端口被占用原因容器有自己的网络命名空间主机和容器的端口是隔离的。容器内占用不代表主机占用。排查方法# 进入容器查看docker exec -it container ss -tlnp# 或者使用 nsenternsenter -t container_pid -n ss -tlnp# 查看容器端口映射docker port container9一键排查脚本把上面的方法组合起来写一个端口占用一键排查脚本#!/bin/bash# check_port.sh - 端口占用一键排查PORT${1:-18789}echo 端口 $PORT 占用情况排查 echoecho 1. ss 命令结果:ss -tlnp 2/dev/null | grep :$PORT || echo 无 LISTEN 状态占用echoecho 2. lsof 命令结果:lsof -i :$PORT 2/dev/null || echo lsof 不可用或无占用echoecho 3. netstat 命令结果:netstat -tlnp 2/dev/null | grep :$PORT || echo netstat 不可用或无占用echoecho 4. fuser 命令结果:fuser -v $PORT/tcp 21 || echo fuser 不可用或无占用echoecho 5. /proc/net/tcp 原始数据:HEX_PORT$(printf %04X $PORT)echo 端口 $PORT 的十六进制: $HEX_PORTcat /proc/net/tcp 2/dev/null | awk -v hp$HEX_PORT $2 ~ :hp$ || $3 ~ :hp$ {print $0} | head -5echoecho 6. TIME_WAIT 状态连接数:ss -tan 2/dev/null | grep :$PORT | grep TIME-WAIT | wc -lechoecho 排查完成 使用方法chmod x check_port.sh./check_port.sh 18789一键排查脚本10常见问答10.1Q1ss 和 netstat 应该用哪个A优先用ss。ss速度更快、信息更全、是iproute2包的一部分。在 CentOS 7、Ubuntu 16.04、所有现代 Linux 发行版上都默认安装。只在老系统或者脚本兼容性要求高时才用netstat。10.2Q2lsof 在容器里查不到东西怎么办A在容器里使用lsof需要特权模式或者直接进入容器的网络命名空间# 方法 1特权模式启动docker run --privileged ...# 方法 2共享网络命名空间docker run --network host ...# 方法 3使用 nsenterPID$(docker inspect -f {{.State.Pid}} container)nsenter -t $PID -n lsof -i :1878910.3Q3杀进程后端口还是占用怎么办A有以下几种可能进程没杀干净——可能存在父子进程需要全部杀掉TIME_WAIT 状态——等待几分钟自然消失内核还在回收——cat /proc/net/sockstat查看 socket 状态多个进程占用——lsof -i :PORT看完整列表10.4Q4如何避免端口被占用的问题A统一管理所有服务都通过 systemd 或容器编排管理禁止手动启动配置端口白名单在防火墙中只开放需要的端口监控告警对端口状态做监控异常时及时告警定期巡检定期检查游离进程和端口占用情况10.5Q5lsof 很慢有更快的替代品吗Ass已经是更快的替代品了。如果lsof还是慢可以考虑fuser速度更快但信息少直接读/proc/net/tcp最快但要自己解析pidstat看进程级别的网络活动11总结端口占用排查是运维的基本功看似简单实则涉及很多细节。本文从ss、lsof、netstat、fuser四个工具入手配合/proc底层分析覆盖了基础端口查看进程 PID 定位幽灵进程排查TIME_WAIT 处理systemd restart loop容器网络命名空间一键排查脚本核心要点首选 ss信息全、速度快、现代化lsof 排查诡异问题信息最全fuser 一键杀进程但要慎用/proc 终极武器所有命令失效时的最后退路希望本文能成为大家排查端口占用问题的案头手册。下次再遇到Address already in use相信你不会再一头雾水了。

相关新闻

鸿蒙 ArkTS 实战:Lab Supply Cabinet 从业务记录到移动工作台完整解析

鸿蒙 ArkTS 实战:Lab Supply Cabinet 从业务记录到移动工作台完整解析

鸿蒙 ArkTS 实战:Lab Supply Cabinet 从业务记录到移动工作台完整解析 前言 Lab Supply Cabinet 是一个面向 实验室耗材柜 的鸿蒙 ArkTS 单页应用。它的实现并不追求复杂后台,而是把一线业务里最常见的记录、数量统计、备注和完成状态放到一个移动工作…

2026/7/18 0:35:21阅读更多 →
Linux操作系统-系统管理

Linux操作系统-系统管理

Linux操作系统-系统管理 一、linux操作系统启动流程 Linux操作系统启动流程如下 加电自检:按下电源开关后会进行硬件加电自检 加载BIOS:BIOS包含CPU、内存、硬盘、设备启动顺序信息、时钟信息等 读取主启动记录(MBR):读取BIOS后,会…

2026/7/18 0:35:21阅读更多 →
音频 AI 智能管理中心主机落地应用指南

音频 AI 智能管理中心主机落地应用指南

在处理企业级音频数据时,最让人头疼的往往不是技术本身,而是数据的“脏乱差”。想象一下这样的场景:客服部门的电话录音、会议室的智能设备采集、外勤人员的移动端上传,这些音频来源各异,格式从 WAV、MP3 到私有编码应…

2026/7/18 0:30:20阅读更多 →
PHP专家进阶:从Opcache调优到内核原理

PHP专家进阶:从Opcache调优到内核原理

1. 为什么PHP专家之路总差"最后一公里"? 十年前我刚接触PHP时,以为掌握语法和框架就是专家。直到参与某电商秒杀系统开发,面对3000QPS的流量,发现连基本的Opcache调优都做不好——这才意识到成为真正的PHP专家&#xff…

2026/7/18 2:55:56阅读更多 →
【HarmonyOS学习笔记】2026-07-17 | 状态管理V2-@Provider/@Consumer

【HarmonyOS学习笔记】2026-07-17 | 状态管理V2-@Provider/@Consumer

【HarmonyOS学习笔记】2026-07-17 | 状态管理V2-Provider/Consumerdate: 2026-07-17 tags: [HarmonyOS, 状态管理V2, Provider, Consumer, ObservedV2, Trace, Monitor, 跨组件通信, 双向绑定] 1️⃣ 学习内容概览 继续学习状态管理V2的跨组件通信机制:Provider/Con…

2026/7/18 2:55:56阅读更多 →
Angular v14核心特性解析与开发实践

Angular v14核心特性解析与开发实践

1. Angular v14 版本解析与核心特性Angular作为前端开发的主流框架之一,其每个大版本更新都带来显著的技术演进。v14版本在2022年6月正式发布,这个版本标志着Angular框架进入更加成熟的阶段。从技术架构来看,v14主要围绕开发者体验、性能优化…

2026/7/18 2:55:56阅读更多 →
C++与C#跨语言调用实战:工业级开发指南

C++与C#跨语言调用实战:工业级开发指南

1. 跨语言调用的工程价值与实践场景 在工业级软件开发中,C与C#的混合编程是解决特定领域问题的经典方案。作为在Windows平台深耕多年的开发者,我经历过数十个需要跨语言调用的项目,其中最常见的场景就是利用C#快速构建GUI或业务逻辑层&#x…

2026/7/18 2:55:56阅读更多 →
MySQL连接数爆满紧急处理与优化指南

MySQL连接数爆满紧急处理与优化指南

1. 当MySQL突然报"Too many connections"时凌晨3点15分,监控系统突然报警,你的MySQL数据库抛出了"ERROR 1040 (HY000): Too many connections"错误。这个瞬间,所有依赖这个数据库的业务系统开始出现连接失败,…

2026/7/18 2:55:56阅读更多 →
Cesium粒子系统原理与WebGL特效开发实战

Cesium粒子系统原理与WebGL特效开发实战

1. Cesium粒子特效核心原理剖析Cesium作为Web端三维地理可视化引擎的标杆,其粒子系统(ParticleSystem)通过GPU加速实现了大规模粒子效果的实时渲染。这套系统的设计哲学是:用最小化的CPU开销控制粒子行为规则,将计算密集型任务交给着色器并行…

2026/7/18 2:50:56阅读更多 →
VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异当你在VSCode中启动一个新的TypeScript项目时,第一个技术决策往往从安装方式开始。这个看似简单的选择——全局安装还是项目本地安装——实际上会深刻影响你的开发流程、团队协作和…

2026/7/17 10:42:55阅读更多 →
智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 智慧树刷课插件是一款专为智慧树在线教育平台设计的Chrome浏…

2026/7/17 8:31:03阅读更多 →
Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否在GOG或Epic Games Store购买了心仪的游戏…

2026/7/17 13:22:23阅读更多 →
从模糊意图到可执行指令:Claude PRD中Prompt Engineering与需求颗粒度的5级映射法则

从模糊意图到可执行指令:Claude PRD中Prompt Engineering与需求颗粒度的5级映射法则

更多请点击: https://kaifayun.com 第一章:从模糊意图到可执行指令:Claude PRD中Prompt Engineering与需求颗粒度的5级映射法则 在Claude驱动的产品需求文档(PRD)生成实践中,原始业务意图往往以自然语言片…

2026/7/18 0:00:14阅读更多 →
Cursor配置生成失效?3大隐藏陷阱+4行修复代码,资深工程师连夜整理的紧急补救清单

Cursor配置生成失效?3大隐藏陷阱+4行修复代码,资深工程师连夜整理的紧急补救清单

更多请点击: https://codechina.net 第一章:Cursor配置生成失效?3大隐藏陷阱4行修复代码,资深工程师连夜整理的紧急补救清单 Cursor 配置生成突然失效,是近期高频报障场景。表面看是 cursor.config.json 未更新或 LSP…

2026/7/18 0:00:14阅读更多 →
某智驾大牛创业

某智驾大牛创业

作者:钟声编辑:Mark出品:红色星际头图:智能驾驶图片据悉,国内某头部智驾公司端到端模型技术大牛Z投身创业,并且已经拿到融资。Z不仅是该头部公司内部最年轻的对标阿里P10级别技术负责⼈,更是业内…

2026/7/18 0:00:14阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/17 22:48:46阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/17 13:22:38阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/17 17:26:50阅读更多 →