Linux lsof 命令

Linux 命令大全 Linux 命令大全


中一个功能强大的命令行工具,用于列出当前系统打开的所有文件及相关进程信息。在 Linux 中,"一切皆文件"的理念意味着 lsof 不仅能显示常规文件,还能显示网络连接、设备文件、管道和套接字等。


lsof 基本语法

lsof [选项] [文件名或目录]

常用选项参数说明

选项 说明
-a 使用 AND 逻辑组合多个条件
-c <进程名> 显示指定进程打开的文件
-d <文件描述符> 显示指定文件描述符的文件
-i 显示网络连接相关信息
-n 不解析主机名(显示 IP 地址)
-P 不解析端口名(显示端口号)
-p <PID> 显示指定进程 ID 打开的文件
-u <用户名> 显示指定用户打开的文件
+D <目录> 递归显示目录下被打开的文件
-t 仅输出进程 ID(适合脚本使用)

常用操作示例

1. 查看所有打开的文件

lsof

这会列出系统中所有被打开的文件,包括普通文件、目录、库文件、设备和网络连接等。

2. 查看指定进程打开的文件

实例

lsof -p 1234  # 查看 PID 为 1234 的进程打开的文件
lsof -c nginx # 查看所有 nginx 进程打开的文件

3. 查看网络连接

实例

lsof -i      # 查看所有网络连接
lsof -i :80  # 查看所有使用 80 端口的连接
lsof -i TCP  # 查看所有 TCP 连接

4. 查看用户打开的文件

lsof -u root  # 查看 root 用户打开的文件

5. 查找被删除但仍被进程占用的文件

lsof | grep deleted

这种情况常见于日志文件被删除但服务仍在运行,导致磁盘空间未被释放。

6. 查看指定目录下被打开的文件

lsof +D /var/log  # 查看 /var/log 目录下被打开的文件

输出字段解析

lsof 命令输出的典型列如下:

COMMAND    PID   USER   FD      TYPE     DEVICE  SIZE/OFF    NODE NAME
  • COMMAND:进程名称
  • PID:进程 ID
  • USER:运行进程的用户
  • FD:文件描述符
    • cwd:当前工作目录
    • txt:程序代码文件
    • mem:内存映射文件
    • 0u1u2u:标准输入、输出、错误
  • TYPE:文件类型(REG 常规文件,DIR 目录,CHR 字符设备等)
  • DEVICE:设备号
  • SIZE/OFF:文件大小或偏移量
  • NODE:文件 inode 号
  • NAME:文件名或挂载点

高级应用场景

1. 查找占用端口的进程

lsof -i :8080

当你想启动服务但端口已被占用时,这个命令能快速找到占用端口的进程。

2. 恢复被删除的文件

当文件被删除但仍有进程在使用时,可以通过 /proc 文件系统恢复:

实例

lsof | grep deleted  # 找到被删除的文件和进程
ls -l /proc//fd  # 查看进程的文件描述符
cp /proc//fd/ /path/to/recovery  # 恢复文件

3. 监控文件访问

watch -n 1 'lsof /path/to/file'

这可以实时监控某个文件被哪些进程访问。


常见问题解决

1. 磁盘空间不足但找不到大文件

lsof | grep deleted

查找被删除但仍被进程占用的文件,然后重启相关进程释放空间。

2. 无法卸载设备

lsof /mount/point

查找哪些进程正在使用挂载点,关闭这些进程后再卸载。

3. 网络连接问题排查

lsof -i -n -P

查看所有网络连接,帮助排查端口冲突或连接问题。


性能考虑

虽然 lsof 功能强大,但在繁忙的生产环境中使用时需要注意:

  1. 直接运行 lsof 会扫描整个系统,可能消耗较多资源
  2. 尽量使用精确的过滤条件(如 -p-u-i 等)缩小查询范围
  3. 在脚本中使用 -t 选项只输出 PID,减少解析开销

替代工具

虽然 lsof 是最常用的工具,但某些场景下可以考虑:

  1. fuser:快速查看哪些进程在使用特定文件或套接字
  2. ss/netstat:专门用于网络连接信息
  3. ps:结合 /proc 文件系统也能获取部分信息

总结

lsof 是 Linux 系统管理员和开发人员的瑞士军刀,掌握它能帮助你:

  1. 快速定位资源占用问题
  2. 排查文件和网络相关问题
  3. 了解系统运行状态
  4. 解决各种"文件被占用"的问题

建议在日常工作中多加练习,结合具体场景灵活运用各种选项参数,逐步掌握这个强大工具的全部潜力。


Linux 命令大全 Linux 命令大全