Linux 网络排障新选择:ss 替代 netstat,lsof 与 pwdx 扩展
Linux 服务出了问题,最常见的现象往往是:端口没有监听、连接数量异常、端口被其他进程占用,或者程序明明启动了,却找不到它读取配置和写入日志的目录。
这类问题不一定需要复杂的监控系统,几个基础命令就能完成大部分定位工作:
本文先解释 ss 和 netstat 的区别,再通过 lsof 和 pwdx 把“端口—进程—工作目录”这条排障链串起来。
一、先说结论:现代 Linux 优先使用 ss
netstat 和 ss 都可以查看网络连接与监听端口,但它们来自不同的工具体系:
netstat 属于传统的 net-tools 工具包。ss 属于现代 Linux 常用的 iproute2 工具包。
netstat 仍然可以使用,很多老教程和运维脚本里也仍然能看到它。但在较新的发行版中,netstat 可能默认没有安装;相比之下,ss 通常更容易获得,并且在大量 socket 场景下查询效率更好。
简单理解:
netstat 是经典工具,ss 是现代替代方案。新系统中,查看网络连接通常优先使用 ss;遇到旧脚本或旧环境时,再使用 netstat。
二、ss 和 netstat 的核心区别
两者都能查看 TCP、UDP、监听端口和连接状态;区别主要在于工具实现、性能和过滤方式,而不是“一个能查网络、另一个完全不能查网络”。
三、netstat:传统命令怎么用
查看 TCP 和 UDP 监听端口:
netstat -tulnp
参数含义:
查看所有连接:
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 基本对应:
查看所有 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 -tulnp | ss -tulnp |
netstat -ant | ss -ant |
netstat -anp | ss -anp |
netstat -s | ss -s |
netstat -rn | ip 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)
重点字段:
当启动服务时遇到:
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 |
| ss -ant |
| ss -s |
| 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