Skip to content

lsof 命令用法整理 ​

简介 ​

lsof(list open files)是一个用于列出当前系统中所有打开文件的命令行工具,它可以帮助我们查看哪些进程正在使用哪些文件、网络连接以及其他资源。通过 lsof 命令,我们可以快速定位系统中的问题,并解决各种与文件相关的问题,例如文件锁定、磁盘空间使用等等。

核心特点

  • 一切皆文件:在 Linux 中,socket、管道、设备等都被视为文件
  • 实时监控:可查看当前时刻系统资源占用情况
  • 排查利器:定位文件占用、端口冲突、进程异常等问题

安装 ​

bash
sudo apt-get install lsof
bash
sudo yum install lsof
bash
sudo pacman -S lsof
bash
sudo zypper install lsof

验证安装:

bash
lsof -v
#lsof version information:
#    revision: 4.99.4
# ...

基础用法 ​

列出所有打开的文件 ​

bash
lsof
提示

出现 unknown 表示没有权限查看

查找特定进程打开的文件 ​

bash
lsof -p PID

PID 是进程号

查找特定用户打开的文件 ​

bash
lsof -u USERNAME

USERNAME 是用户名

查找指定目录下被打开的文件 ​

bash
lsof +D /path/to/directory
# 也可以单独查询单个文件
lsof /path/to/file

查看某个端口是否被占用 ​

bash
lsof -i:port

port 是要查询的端口号。如果端口被占用,会输出占用端口的进程信息。

输出列说明 ​

列名含义示例
COMMAND进程名称nginx
PID进程 ID1234
USER运行用户www-data
FD文件描述符cwd, txt, 1u
TYPE文件类型REG, DIR, IPv4
DEVICE设备号8,1
SIZE/OFF文件大小或偏移1024
NODE节点号12345
NAME文件/连接名称/var/log/nginx.log

FD 文件描述符常见值

  • cwd: 当前工作目录
  • txt: 程序代码
  • mem: 内存映射文件
  • mmap: 内存映射设备
  • 数字 + 字母:如 1u 表示文件描述符 1,u 表示读写模式

使用实例 ​

场景 1:查找占用端口的进程 ​

bash
# 查看 8080 端口被谁占用
lsof -i:8080

# 结合 grep 过滤
lsof -i:8080 | grep LISTEN

场景 2:查找删除后仍被占用的文件 ​

bash
# 查找已删除但仍被进程占用的文件(释放磁盘空间)
lsof | grep deleted

# 示例输出
# nginx  1234  www-data  1w  REG  8,1  1024  /var/log/access.log (deleted)

场景 3:查看进程打开的文件数量 ​

bash
# 统计每个进程打开的文件数
lsof | awk '{print $1}' | sort | uniq -c | sort -rn | head -20

场景 4:监控文件变化 ​

bash
# 持续监控某目录的文件打开情况
watch -n 1 'lsof +D /var/log'

场景 5:查找网络连接 ​

bash
# 查看所有 TCP 连接
lsof -i tcp

# 查看已建立的连接
lsof -i tcp -s TCP:ESTABLISHED

# 查看监听端口
lsof -i -s TCP:LISTEN

场景 6:强制结束占用文件的进程 ​

bash
# 先查找占用文件的进程
lsof /path/to/file

# 获取 PID 后结束进程
kill -9 $(lsof -t /path/to/file)

常用参数汇总 ​

参数说明示例
-p指定进程 IDlsof -p 1234
-u指定用户lsof -u root
-i网络连接lsof -i:80
-c指定命令名lsof -c nginx
+D递归目录lsof +D /var
-t仅输出 PIDlsof -t file
-n不解析主机名lsof -n -i
-P不解析端口名lsof -P -i

相关命令 ​

  • fuser
    • 速度快,输出简洁,自带杀进程功能(-k)
    • 信息较少
    • 快速解决冲突(如卸载 U 盘、删除锁文件)
  • ps / pgrep
    • 专注于运行中的程序实例
    • 无法直接关联到普通数据文件
    • 查看"程序"是否在运行
  • netstat / ss
    • 专注于网络连接统计
    • 更适合分析网络状态

注意事项 ​

性能影响

  • lsof 扫描整个系统,大量文件时执行较慢
  • 生产环境避免频繁使用,建议配合 -n -P 加速
bash
# 加速查询(不解析主机名和端口名)
lsof -n -P -i:80

权限要求

  • 普通用户只能查看自己进程的文件
  • 查看系统级文件需要使用 sudo
  • 某些安全策略可能限制 lsof 的使用

最佳实践

  1. 优先使用 -n -P 避免 DNS 解析延迟
  2. 配合 grep、awk 等工具过滤结果
  3. 大系统先限定范围(用户/进程/目录)再查询

总结 ​

特性lsoffuser
信息详细度⭐⭐⭐⭐⭐⭐⭐⭐
执行速度⭐⭐⭐⭐⭐⭐⭐⭐
网络支持✅⚠️
杀进程❌✅
适用场景深度排查快速定位
  • 信息极其详细(用户、命令、文件描述符)
  • 系统负载稍高,输出冗长
  • 深度排查,需要知道进程在干什么

一句话总结

lsof 是 Linux 系统排查的"瑞士军刀",适合深入分析文件、网络、进程关系,日常配合 -n -P 参数使用可提升效率。