当前位置:首页>Linux>Linux 网络排障新选择:ss 替代 netstat,lsof 与 pwdx 扩展

Linux 网络排障新选择:ss 替代 netstat,lsof 与 pwdx 扩展

  • 2026-10-11 06:03:49
Linux 网络排障新选择:ss 替代 netstat,lsof 与 pwdx 扩展

Linux 网络排障新选择:ss 替代 netstat,lsof 与 pwdx 扩展

Linux 服务出了问题,最常见的现象往往是:端口没有监听、连接数量异常、端口被其他进程占用,或者程序明明启动了,却找不到它读取配置和写入日志的目录。

这类问题不一定需要复杂的监控系统,几个基础命令就能完成大部分定位工作:

  • ss:查看 socket、监听端口和网络连接
  • netstat:传统的网络状态查看工具
  • lsof:从进程角度查看打开的文件和网络连接
  • pwdx:查看进程当前工作目录

本文先解释 ss 和 netstat 的区别,再通过 lsof 和 pwdx 把“端口—进程—工作目录”这条排障链串起来。

一、先说结论:现代 Linux 优先使用 ss

netstat 和 ss 都可以查看网络连接与监听端口,但它们来自不同的工具体系:

  • netstat 属于传统的 net-tools 工具包。
  • ss 属于现代 Linux 常用的 iproute2 工具包。

netstat 仍然可以使用,很多老教程和运维脚本里也仍然能看到它。但在较新的发行版中,netstat 可能默认没有安装;相比之下,ss 通常更容易获得,并且在大量 socket 场景下查询效率更好。

简单理解:

netstat 是经典工具,ss 是现代替代方案。新系统中,查看网络连接通常优先使用 ss;遇到旧脚本或旧环境时,再使用 netstat。

二、ss 和 netstat 的核心区别

对比项
ss
netstat
所属工具包
iproute2
net-tools
工具定位
现代 socket 统计工具
传统网络状态工具
查询性能
通常更快,适合大量连接
相对较慢
新系统默认情况
通常已安装
可能未安装
过滤能力
支持丰富的 socket 表达式
参数直观,但过滤能力相对传统
适合场景
日常排障、连接状态分析
兼容旧环境和旧脚本

两者都能查看 TCP、UDP、监听端口和连接状态;区别主要在于工具实现、性能和过滤方式,而不是“一个能查网络、另一个完全不能查网络”。

三、netstat:传统命令怎么用

查看 TCP 和 UDP 监听端口:

netstat -tulnp

参数含义:

  • -t:显示 TCP
  • -u:显示 UDP
  • -l:只显示监听状态
  • -n:直接显示数字地址和端口,不解析名称
  • -p:显示进程信息

查看所有连接:

netstat -anp

查看 TCP 连接:

netstat -ant

查看路由表:

netstat -rn

如果系统提示:

bash: netstat: command not found

可以安装对应工具包。例如 Debian/Ubuntu 系统通常需要安装 net-tools:

sudo apt install net-tools

不过,如果只是为了查看端口和 socket,通常没有必要专门安装 netstat,直接使用 ss 更合适。

四、ss:现代 Linux 的首选工具

查看所有 TCP 和 UDP 监听端口:

ss -tulnp

参数含义与 netstat 基本对应:

  • -t:TCP
  • -u:UDP
  • -l:监听 socket
  • -n:不解析服务名和域名
  • -p:显示进程信息

查看所有 TCP 连接:

ss -ant

查看已建立的 TCP 连接:

ss -tn state established

查看连接状态统计:

ss -s

这个命令适合快速判断当前机器是否存在大量 TIME-WAIT、CLOSE-WAIT 或其他异常连接。

1. 查询指定端口

查看 8080 端口是否正在监听:

ss -ltnp 'sport = :8080'

查看连接到远程 3306 端口的连接:

ss -tn 'dport = :3306'

查看所有监听在本机 127.0.0.1 上的 TCP 端口:

ss -ltn 'src 127.0.0.1'

2. 查看 Unix Domain Socket

ss 不只可以查看 TCP 和 UDP,还可以查看 Unix Domain Socket:

ss -lx

查看所有 socket:

ss -xap

这对排查 Docker、Nginx、数据库或本地服务之间通过 Unix socket 通信的问题很有帮助。

五、netstat 命令如何迁移到 ss

很多时候可以直接按照下面的方式替换:

传统写法
推荐写法
netstat -tulnpss -tulnp
netstat -antss -ant
netstat -anpss -anp
netstat -sss -s
netstat -rnip route

需要注意,netstat 的所有参数都不能机械地和 ss 一一对应。尤其是查看路由、网卡和 ARP 信息时,现代工具通常分别使用:

ip routeip addrip neigh

也就是说,ss 主要替代 netstat 的 socket 和连接查看能力;它不是整个 net-tools 工具包的完全等价替代品。

六、lsof:端口到底被哪个进程占用了

lsof 的全名是“list open files”,即列出进程打开的文件。Linux 中网络 socket 也属于进程打开的文件,因此 lsof 可以从进程角度查看网络连接。

查看 8080 端口的占用情况:

lsof -nP -i :8080

常见输出类似:

COMMAND  PID  USER  FD  TYPE DEVICE SIZE/OFF NODE NAMEjava    1234  app   123u IPv6  ...        TCP *:8080 (LISTEN)

重点字段:

  • COMMAND:进程名称
  • PID:进程 ID
  • USER:进程所属用户
  • FD:文件描述符
  • TYPE:文件或 socket 类型
  • NAME:网络地址和端口状态

当启动服务时遇到:

Address already in use

可以直接执行:

lsof -nP -i :8080

然后根据 PID 进一步查看进程:

ps -fp 1234

1. 查看所有 TCP 监听端口

sudo lsof -nP -iTCP -sTCP:LISTEN

2. 查看某个进程的网络连接

sudo lsof -nP -p 1234 -a -i

3. 查看某个用户打开的网络文件

lsof -nP -u app -i

-nP 很实用:-n 禁止 DNS 解析,-P 直接显示端口号,可以避免命令因为名称解析变慢,也让输出更适合脚本处理。

七、ss 和 lsof 的区别

两者都能显示监听端口和进程,但关注角度不同:

ss 以 socket 和连接状态为中心,lsof 以进程打开的文件为中心。

问题
更适合的命令
哪些端口正在监听?
ss -ltnp
当前有哪些 TCP 连接?
ss -ant
连接处于什么状态?
ss -s
 或 ss -tn
8080 被谁占用?
lsof -i :8080
某个进程连接了哪些地址?
lsof -p PID -a -i
某个进程打开了哪些文件?
lsof -p PID

一般建议是:先用 ss 快速了解网络状态,再用 lsof 从进程角度深入定位。

八、pwdx:查看进程当前工作目录

pwdx 用于报告进程的当前工作目录:

pwdx PID

例如:

pwdx 1234

输出:

1234: /opt/myapp

这表示 PID 为 1234 的进程当前工作目录是 /opt/myapp。

pwdx 查看的是进程的工作目录,不是进程执行文件的位置。一个 Java 进程可能是这样:

执行文件:/usr/bin/java工作目录:/opt/myapp

直接读取 /proc 也可以得到同样的信息:

readlink -f /proc/1234/cwd

查看进程实际执行文件:

readlink -f /proc/1234/exe

为什么工作目录很重要?

如果程序使用相对路径:

Files.readString(Path.of("config/app.yml"));

这个路径是相对于进程当前工作目录,而不是相对于 JAR 文件所在目录。

因此,当程序出现下面的问题时,可以使用 pwdx:

  • 配置文件找不到
  • 相对路径日志不知道写到哪里
  • 上传文件或临时文件位置不明确
  • systemd、脚本和 Docker 启动目录与预期不一致

九、从端口追到进程,再追到工作目录

下面是一条比较实用的排障链:

第一步:确认端口是否监听

ss -ltnp 'sport = :8080'

如果输出中看到 PID,例如 pid=1234,继续下一步。

第二步:查看进程详细信息

ps -fp 1234

第三步:查看进程打开的网络连接

lsof -nP -p 1234 -a -i

第四步:查看进程当前工作目录

pwdx 1234

或者:

readlink -f /proc/1234/cwd

第五步:查看进程打开的配置和日志文件

lsof -p 1234 | grep -E 'config|log|\.yml|\.yaml|\.properties'

这套流程可以回答一个完整的问题:

谁监听了这个端口?它和哪些服务建立了连接?它从哪个目录启动?打开了哪些配置和日志文件?

十、几个常见排障场景

场景一:服务启动失败,提示端口被占用

ss -ltnp 'sport = :8080'lsof -nP -i :8080ps -fp PID

ss 负责确认监听状态,lsof 负责确认进程,ps 负责查看完整启动命令。

场景二:服务连接数据库后经常断开

ss -tnp 'dport = :3306'lsof -nP -p PID -a -i

重点观察连接状态、远程地址、进程是否真的持有连接,以及是否存在大量 CLOSE-WAIT。

场景三:程序说找不到配置文件

ps -fp PIDpwdx PIDreadlink -f /proc/PID/exelsof -p PID | grep -E 'yml|yaml|properties|conf'

先确认工作目录,再确认启动参数和实际打开的文件,比盲目修改配置路径更可靠。

场景四:机器出现大量连接

ss -sss -antss -ant state time-waitss -ant state close-wait

如果需要追到具体进程:

sudo lsof -nP -i

TIME-WAIT 不一定表示故障,CLOSE-WAIT 则常常值得重点检查应用是否正确关闭连接。

十一、权限与安全注意事项

查看自己启动的进程通常不需要特殊权限,但查看其他用户的进程、完整进程信息或 socket 归属时,可能需要 sudo:

sudo ss -ltnpsudo lsof -nP -isudo pwdx 1234

生产环境中不要随意把完整命令行、环境变量、连接地址和凭证信息粘贴到公开日志或聊天群。ps、lsof 等命令的输出可能包含敏感参数。

十二、总结

netstat 是传统的网络状态查看工具,ss 是现代 Linux 中更推荐的 socket 查询工具。新系统中,查看监听端口、连接状态和 socket 统计,优先使用 ss;需要兼容旧脚本或旧环境时,再使用 netstat。

当问题从“网络现象”进一步落到“哪个进程造成的”时,使用 lsof;当问题继续落到“这个进程从哪里启动、相对路径指向哪里”时,使用 pwdx。

可以把它们记成一条排障链:

ss / netstat:发现网络现象        ↓lsof:定位相关进程        ↓pwdx:确认进程工作目录        ↓ps + /proc:查看启动命令、执行文件和打开的配置

真正高效的 Linux 排障,不是记住最多的命令,而是知道每个命令应该回答什么问题。

参考资料

  • ss(8) Linux manual page https://man7.org/linux/man-pages/man8/ss.8.html[1]
  • netstat(8) Linux manual page https://man7.org/linux/man-pages/man8/netstat.8.html[2]
  • lsof(8) Linux manual page https://man7.org/linux/man-pages/man8/lsof.8.html[3]
  • pwdx(1) Linux manual page https://man7.org/linux/man-pages/man1/pwdx.1.html[4]
  • /proc/PID/cwd Linux manual page https://man7.org/linux/man-pages/man5/proc_pid_cwd.5.html[5]

引用链接

[1]https://man7.org/linux/man-pages/man8/ss.8.html

[2]https://man7.org/linux/man-pages/man8/netstat.8.html

[3]https://man7.org/linux/man-pages/man8/lsof.8.html

[4]https://man7.org/linux/man-pages/man1/pwdx.1.html

[5]https://man7.org/linux/man-pages/man5/proc_pid_cwd.5.html

最新文章

随机文章