做什么

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 快)