下面我将详细解释这三种命令的用法,并比较它们的特点,让你在面试中能够对答如流。
1. lsof - “List Open Files”
在Linux中,一切皆文件,网络连接也被视为一种文件。因此 lsof 可以列出所有被进程打开的文件,包括网络端口。
最常用的命令格式:
# 查看哪个进程在监听特定端口(例如 3306)
sudo lsof -i :3306
# 查看哪个进程在使用某个特定的TCP或UDP端口
sudo lsof -i TCP:3306
sudo lsof -i UDP:53
输出结果解读:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld 1234 mysql 12u IPv4 24567 0t0 TCP *:mysql (LISTEN)
-
COMMAND:进程名称(
mysqld) -
PID:进程ID(
1234) -
USER:进程所有者(
mysql) -
FD:文件描述符(
12u),u表示可读可写 -
TYPE:类型(
IPv4) -
NAME:显示协议、状态(
LISTEN)和端口号(mysql或直接显示3306)
lsof 的优势:
-
非常直接:命令意图明确,输出结果一目了然,直接告诉你“谁”在“听”或“连”。
-
信息丰富:一次性提供了进程名、PID、用户等关键信息。
2. netstat - 传统网络统计工具
这是一个非常经典和通用的网络诊断工具,几乎在所有Linux发行版中都预装。
最常用的命令格式:
# 查看所有监听端口和对应的进程
sudo netstat -tulnp
# 只查看特定端口(例如 3306)
sudo netstat -tulnp | grep :3306
参数解释:
-
-t:TCP 协议 -
-u:UDP 协议 -
-l:仅显示监听状态的端口 -
-n:以数字形式显示地址和端口(不进行域名解析,速度更快) -
-p:显示进程/程序名称和PID
输出结果解读:
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 1234/mysqld
-
同样可以清晰地看到是
mysqld进程(PID 1234)在监听 3306 端口。
3. ss - Socket Statistics (netstat 的现代替代品)
ss 是 netstat 的下一代工具,来自 iproute2 软件包。它更快,并且显示了更多的TCP状态信息。
最常用的命令格式:
# 查看所有监听端口和对应的进程
sudo ss -tulnp
# 只查看特定端口(例如 3306)
sudo ss -tulnp sport = :3306
参数解释: (与 netstat 基本相同)
-
-t:TCP -
-u:UDP -
-l:Listening -
-n:Numeric -
-p:Processes
输出结果解读:
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
tcp LISTEN 0 80 0.0.0.0:3306 0.0.0.0:* users:(("mysqld",pid=1234,fd=12))
-
信息与
netstat类似,但格式稍有不同。
总结与面试回答建议
面试时,你可以这样结构清晰地回答:
“在Linux中,有多种方法可以查看端口占用情况,我常用的有三种:
-
lsof -i :端口号:-
这是最直观的方法。因为它基于‘一切皆文件’的理念,直接列出打开指定网络‘文件’的进程。命令简单,输出信息明确,直接显示进程名、PID和用户。
-
-
netstat -tulnp | grep 端口号:-
这是最经典通用的方法。几乎所有系统都预装,功能全面,可以查看监听、连接状态等各种网络信息。缺点是当连接数巨大时,速度可能稍慢。
-
-
ss -tulnp:-
这是现代且高效的替代品,来自
iproute2工具集。它比netstat更快,并且能显示更详细的TCP内部状态(如Recv-Q,Send-Q)。在很多新系统中,推荐使用ss来替代netstat。
-
-
如果只是快速查一个特定端口,我首选
lsof,因为它最直接。 -
如果需要分析复杂的网络连接状态,我会使用功能更强大的
ss。”
4105

被折叠的 条评论
为什么被折叠?



