lsof 的网络视角是什么
lsof 本职是「列出打开的文件」,而网络套接字在 Linux 里也是一种文件,所以 lsof -i 能把进程与网络连接对应起来:哪个进程监听着哪个端口、哪个进程连到了哪个对端。它回答的问题比 ss 多一层——ss 告诉你端口被占用,lsof 直接告诉你是哪个进程、以什么身份、命令路径是什么。
基本信息
| 适用平台 | Linux/Unix(lsof 包,多数发行版需单独安装) |
|---|---|
| 命令语法 | lsof -i [条件] / lsof -i :端口 / lsof -i @对端地址 |
| 常用选项 | -n 不解析主机名 -P 不解析端口名 -s 按协议与状态过滤 -a 让多个条件取交集 -u 按用户过滤 |
| 默认逻辑 | 多个条件之间是「或」关系,需要「与」时必须显式加 -a |
| 权限说明 | 看别人的进程需要 root;普通用户只能看到自己进程的相关条目 |
典型使用场景
- 端口占用定位:启动报 Address already in use 时确认是谁占着
- 进程审计:确认某个服务的进程实际连到了哪些对端
- 安全排查:看是否有进程在对外建立可疑连接
- 按用户过滤:只看 www 或 deploy 用户的网络活动
- 核对监听范围:确认服务绑的是 0.0.0.0 还是 127.0.0.1
常用示例
常用示例
lsof -i :8080 # 谁在监听或使用 8080
lsof -i -sTCP:LISTEN -nP | head # 全部监听,等价于 ss -tlnp
lsof -i @10.0.0.9 # 与该地址相关的连接
lsof -a -u www-data -i # -a 让用户与 -i 取交集
lsof -i tcp:443 -sTCP:ESTABLISHED -nP | head # 只看已建立的 443 连接
lsof -p 1234 -a -i # 指定进程的网络连接输出关键列读法
| 列 | 含义 | 怎么看 |
|---|---|---|
| COMMAND | 进程名(可能被截断显示) | 配合 PID 列一起定位 |
| PID | 进程号 | 用 ps -p 或 /proc/PID 继续深挖 |
| USER | 进程属主 | 异常用户持有网络连接值得留意 |
| FD | 文件描述符与模式 | 带 u 表示可读写,是套接字编号 |
| TYPE | 套接字类型 | IPv4、IPv6、unix 等 |
| NAME | 地址与状态 | 显示为 *:8080 (LISTEN) 即监听所有地址 |
速度上 ss 更快也更准(直接通过 netlink 从内核取套接字表),lsof -i 要遍历 /proc 里各进程的文件描述符,连接多时明显更慢;但 lsof 的好处是能直接给出命令路径与属主。实践中用 ss 定位端口、再用 lsof 看进程细节最省事。
lsof 只能看到仍有进程持有的套接字:处于 TIME_WAIT 之类已经没有进程关联的连接它看不到,那类情况必须用 ss。反过来,如果 lsof 结果为空而端口确实被占用,先确认是不是权限不足——普通用户看不到他人进程的条目。
需要脚本解析时用 -F 定制输出字段,例如 lsof -Fpcn 会按字段标识输出 PID、命令名与地址端口,比解析默认的表格对齐文本稳。默认输出为了人看而做了列宽对齐与名称截断,不适合直接交给 awk 取列。