做什么
list open files——"一切皆文件" 包括 socket / 管道 / 设备。强大但易上手。
实战
sudo lsof # 全系统打开的文件(很多)
sudo lsof | wc -l # 总数
# 谁在用某文件
sudo lsof /var/log/syslog
# 进程 1234 打开的所有 fd
sudo lsof -p 1234
# 某用户打开的
sudo lsof -u wadely
# 某命令的
sudo lsof -c nginx
网络相关(用得最多)
sudo lsof -i # 所有网络连接
sudo lsof -i tcp # 只 TCP
sudo lsof -i :80 # 80 端口
sudo lsof -i tcp:443 # TCP 443
sudo lsof -i @1.2.3.4 # 跟某 IP 的连接
sudo lsof -i -P -n # -P 不解析端口名 -n 不解析 IP(更快)
文件 / 目录相关
sudo lsof +D /var/log # /var/log 下所有打开的文件(递归)
sudo lsof /home/wadely # 谁在这目录里
# 删了但还被打开的文件(占空间但 df 显示不出来)
sudo lsof | grep deleted
实战:常见排查
1. 端口被谁占了
sudo lsof -i :5500
# COMMAND PID USER FD TYPE NODE NAME
# python 12345 wadely 3u IPv4 ... *:5500 (LISTEN)
2. 卸不掉的目录"target is busy"
sudo lsof +D /mnt/usb
# 看谁还在里面 → 关掉它
3. 磁盘满但找不到大文件
服务在写日志 → 你 rm 删了文件 → 但服务还开着 fd → 空间不释放:
sudo lsof | grep deleted
# nginx 1234 ... /var/log/nginx/access.log (deleted)
重启对应服务才会真正释放。
4. 看某服务用了哪些库
sudo lsof -p $(pgrep nginx | head -1) | grep '\.so'
常用参数
| 参数 | 含义 |
|---|---|
-i |
网络(含端口) |
-p PID |
某进程 |
-u USER |
某用户 |
-c CMD |
某命令 |
+D DIR |
某目录递归 |
-n |
不解析 IP |
-P |
不解析端口名 |
-r N |
每 N 秒刷新(持续监控) |
坑
- lsof 输出有时很慢(全系统扫)——加
-i/-p等限定符快很多 - 没 sudo 只能看自己进程的 fd
- 现代替代:
ss -tlnp(看监听端口比 lsof 快)