ss、lsof 命令
应用场景
- 验证服务端口监听状态,看服务是启动/停机状态。
- 排查端口冲突。
- 如果不知道服务监听的是哪个端口,可以用 ss 去查看。
ss 命令
典型用法
以常用的 ss -anltp
为例,条命令用于列出系统中所有处于监听(LISTEN)状态的 TCP 端口及其关联的进程信息,下面是详细解析:
ss
Socket Statistics 的缩写,用于查看套接字(Socket)统计信息,比netstat
更快速且功能更强大。- 参数说明
-a
:显示所有 Socket(包括监听和非监听的)。-n
:以数字形式显示地址和端口(不解析域名和服务名称)。-l
:仅显示监听(LISTEN)状态的 Socket。-t
:仅显示 TCP 协议的 Socket。-p
:显示使用 Socket 的进程信息(进程名和 PID)。
输出示例:
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=1234,fd=6))
LISTEN 0 128 127.0.0.1:3306 0.0.0.0:* users:(("mysqld",pid=5678,fd=10))
LISTEN 0 128 :::8080 :::* users:(("java",pid=9012,fd=3))
Process
:关联的进程名称和 PID(非 root 权限时,可能有些进程查看不到)。
更加常用的是 ss -anltp | grep <端口号>
,通过增加 grep <端口号> 命令可以查看应用服务是否正常启动或停用。
Address:Port 和 Peer Address:Port 理解
Local Address:Port
:代表当前主机的 ip 和端口号
0.0.0.0:80
:监听所有 IPv4 接口的 80 端口。0.0.0.0 代表外部 ip 可以访问到。:::80
:监听所有 IPv6 接口的 80 端口。127.0.0.1:3306
:仅允许本地(Loopback)访问。
Peer Address:Port
:代表远程主机的 ip 和端口号
0.0.0.0:*
或:::*
:一般都是这样的值,代表监听状态的 Socket 尚未与任何远程设备建立连接,因此远程地址和端口无意义。
示例:Web 服务器监听端口
-
命令输出:
Local Address:Port Peer Address:Port 0.0.0.0:80 0.0.0.0:*
-
解读:
-
Local Address:Port
:服务监听所有网络接口(0.0.0.0
)的80
端口。 -
Peer Address:Port
:未建立连接,显示通配符*
。
-
如果建立了远程连接,如何区分服务端和客户端?
- 服务端:
Local Address:Port
是固定的监听端口(如:80
),Peer Address:Port
在建立连接后显示客户端地址。 - 客户端:
Local Address:Port
是随机临时端口,Peer Address:Port
是服务端的地址和端口。
示例:客户端访问远程服务
-
命令输出:
Local Address:Port Peer Address:Port 192.168.1.10:55678 93.184.216.34:443
-
解读:
Local Address:Port
:客户端使用本地55678
端口发起连接。Peer Address:Port
:连接的目标是远程93.184.216.34
的443
端口(HTTPS)。
示例:SSH 连接已建立
-
命令输出:
Local Address:Port Peer Address:Port 10.0.0.2:22 192.168.1.100:51234
-
解读:
Local Address:Port
:SSH 服务端在10.0.0.2
的22
端口监听。Peer Address:Port
:客户端 IP 是192.168.1.100
,使用临时端口51234
连接。
应用场景示例
-
验证服务端口监听状态
ss -anltp | grep 3306 # 检查 MySQL 是否监听 3306 端口
-
排查端口冲突
若启动服务时报错Address already in use
,可快速定位占用端口的进程。ss -anltp | grep 8080 # 查找 8080 端口的占用进程
lsof 命令
ss
和 lsof
都是 Linux 系统中用于查看网络和进程信息的工具,但它们的设计目的、功能侧重点和使用场景有显著区别。以下是详细对比。
设计目的:
ss
(Socket Statistics)- 专为高效分析网络连接设计,替代传统的
netstat
。 - 直接读取内核的套接字信息,性能极佳(尤其在连接数多时)。
- 核心功能:查看监听端口、活动连接、TCP/UDP 状态等。
- 专为高效分析网络连接设计,替代传统的
lsof
(List Open Files)- 用于列出所有被进程打开的文件(包括普通文件、目录、网络套接字、设备等)。
- 通过解析
/proc
文件系统获取信息,功能更通用但开销较大。 - 核心功能:定位进程占用的文件或网络资源。
输出信息:
-
ss
示例输出(网络连接):State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB 0 0 192.168.1.10:ssh 203.0.113.5:12345 LISTEN 0 128 0.0.0.0:http 0.0.0.0:*
- 聚焦于连接的五元组(状态、协议、本地/远程地址、端口)。
-
lsof
示例输出(进程与文件):COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME nginx 1234 root 6u IPv4 12345 0t0 TCP *:http (LISTEN) mysqld 5678 mysql 10u IPv6 67890 0t0 TCP [::1]:3306 (LISTEN)
- 包含进程名、PID、用户、文件描述符(FD)、文件类型等详细信息。