[Tool] lsof: 列出打开的文件描述符

news/2025/10/21 23:35:46/文章来源:https://www.cnblogs.com/migrator/p/19156670
[Tool] lsof: 列出打开的文件描述符

目录
  • 1. 概述
  • 2. 前提条件
  • 3. 常用选项和用法
  • 4. 常用示例
    • 4.1 查看指定进程打开的文件
    • 4.2 查看网络连接
    • 4.3 查看指定用户打开的文件
    • 4.4 查看端口占用
    • 4.5 组合过滤(查找进程的日志文件)
    • 4.6 显示文件描述符标志
    • 4.7 查看文件被谁占用
    • 4.8 查看被删除但仍占用的文件
    • 4.9 查看进程占用端口
    • 4.10 查找所有进程打开的临时文件
    • 4.11 查看进程工作目录
    • 4.12 查找导致磁盘空间未释放的“幽灵文件”
  • 5. 高级技巧
    • 5.1 跟踪文件访问(结合 strace
    • 5.2 查找指定目录下所有打开的文件
    • 5.3 限制输出到特定协议
    • 5.4 周期性监控
  • 6. 验证和调试
  • 7. 注意事项

1. 概述

lsof 命令用于列出进程打开的文件描述符(FD),包括普通文件、目录、设备文件、网络套接字(如 TCP/UDP 连接)、管道等。它在调试进程行为、排查资源占用(如端口、文件)或释放磁盘空间等问题时非常有用。其基本语法为:

lsof [选项] [条件]
  • 选项:控制输出内容或过滤方式,如 -p(指定进程)、-i(网络文件)。
  • 条件:指定查找目标,如文件名、端口、PID、用户等。

常用命令总结

  • 查看进程文件lsof -p $(pgrep -f nginx)
  • 查看网络连接lsof -i TCPlsof -i :80
  • 查看用户文件lsof -u apache
  • 查看文件占用lsof /path/to/file
  • 查找已删除文件lsof +L1lsof | grep deleted
  • 查看临时文件lsof | grep '/tmp/'
  • 查看工作目录lsof -p <PID> | grep cwd
  • 排查幽灵文件lsof | grep deleted | awk '{print $2,$4,$9}' | sort -u

2. 前提条件

  • 权限:普通用户可查看自己进程的文件,部分操作(如查看所有进程或系统文件)需 root 权限。
  • 工具lsof 通常预装在 Linux 系统中,属于 lsof 包。若缺失,可安装:
    sudo apt update && sudo apt install lsof  # Debian/Ubuntu
    sudo yum install lsof                   # CentOS/RHEL
    
  • 注意:大量输出可能需要结合 grepawk 或分页工具(如 less)处理。

3. 常用选项和用法

以下是 lsof 的常用选项及其功能:

  • 基本选项

    • -p PID:列出指定进程 ID(PID)打开的文件。
    • -u USER:列出指定用户打开的文件。
    • -i [PROTOCOL]:列出网络文件(如 TCP/UDP 连接),可指定协议、地址或端口。
    • -a:逻辑与,组合多个条件。
    • +L1:列出链接数为 0 的文件(通常是被删除但仍被占用的文件)。
    • +fg:显示文件描述符(FD)标志,详细列出文件访问模式。
  • 输出字段

    • COMMAND:进程名称。
    • PID:进程 ID。
    • USER:运行进程的用户。
    • FD:文件描述符(如 cwd 表示工作目录,txt 表示可执行文件,数字表示文件句柄)。
    • TYPE:文件类型(如 REG 表示普通文件,DIR 表示目录,IPv4 表示网络套接字)。
    • NAME:文件路径或网络连接信息。

4. 常用示例

以下是 lsof 命令的常见用法,涵盖查看进程文件、网络连接、端口占用和高级场景。

4.1 查看指定进程打开的文件

列出 nginx 进程打开的所有文件:

lsof -p $(pgrep -f nginx)
  • 说明
    • pgrep -f nginx:查找 nginx 进程的 PID。
    • -p:指定 PID,列出该进程打开的文件(包括文件、目录、套接字等)。
  • 示例输出
    COMMAND   PID     USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
    nginx   12345 www-data  cwd    DIR  8,1     4096 123456 /var/www
    nginx   12345 www-data    0u  CHR  1,3      0t0   1234 /dev/null
    

4.2 查看网络连接

列出所有 TCP 连接:

lsof -i TCP
  • 说明-i TCP 列出所有 TCP 网络连接(包括监听和已建立的连接)。
  • 示例输出
    COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
    sshd     1234 root    3u  IPv4 123456    0t0  TCP *:22 (LISTEN)
    

列出所有 UDP 连接:

lsof -i UDP

4.3 查看指定用户打开的文件

列出用户 apache 打开的所有文件:

lsof -u apache
  • 说明-u apache 列出 apache 用户的进程打开的文件。
  • 注意:需确保用户存在,可用 id apache 确认。

4.4 查看端口占用

查看占用 80 端口的进程:

lsof -i :80
  • 说明-i :80 列出绑定到端口 80(HTTP)的进程。
  • 示例输出
    COMMAND   PID     USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
    nginx   12345 www-data    4u  IPv4 123456    0t0  TCP *:80 (LISTEN)
    

查看特定协议和端口(如 TCP 30000):

lsof -i TCP:30000

4.5 组合过滤(查找进程的日志文件)

查找 java 进程打开的 .log 文件:

lsof -p $(pgrep java) | grep '\.log$'
  • 说明
    • -p $(pgrep java):指定 java 进程的 PID。
    • grep '\.log$':过滤以 .log 结尾的文件。
  • 示例输出
    java    5678 user  10w   REG  8,1  1024 123456 /var/log/app.log
    

4.6 显示文件描述符标志

列出指定进程(PID 为 <PID>)的文件描述符详细信息:

lsof -p <PID> +fg
  • 说明+fg 显示文件描述符的标志(如读写模式),<PID> 需替换为实际进程 ID。
  • 示例输出
    COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF FLAG NODE NAME
    bash    1234 user  cwd    DIR  8,1     4096 0x00 1234 /home/user
    

4.7 查看文件被谁占用

查看文件 /path/to/file 被哪些进程占用:

lsof /path/to/file
  • 说明:直接指定文件路径,列出打开该文件的进程。
  • 示例输出
    COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
    cat     5678 user    3r   REG  8,1   1024 123456 /path/to/file
    

4.8 查看被删除但仍占用的文件

查找已被删除但仍被进程占用的文件(链接数为 0):

lsof +L1
  • 说明
    • +L1:列出链接数小于 1 的文件(通常是被删除但仍被进程持有的文件)。
    • 这些文件可能导致磁盘空间未释放。
  • 示例输出
    COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NLINK NAME
    java    5678 user   10w   REG  8,1  1048576     0 /tmp/deleted.log (deleted)
    

查找特定文件的占用(包括已删除):

lsof /path/to/file | grep deleted

4.9 查看进程占用端口

查看指定进程(如 nginx)的 TCP 端口占用:

lsof -p $(pgrep -f nginx) | grep TCP

查看指定 PID 的 UDP 端口占用:

lsof -p <PID> | grep UDP
  • 说明:过滤 TCPUDP 连接,检查进程的网络活动。

4.10 查找所有进程打开的临时文件

查找 /tmp 目录下被进程打开的文件:

lsof | grep '/tmp/'
  • 说明grep '/tmp/' 过滤路径包含 /tmp/ 的文件,适用于查找临时文件占用。

4.11 查看进程工作目录

查看指定进程(PID 为 <PID>)的工作目录(cwd):

lsof -p <PID> | grep cwd
  • 说明grep cwd 过滤进程当前工作目录(FD 列为 cwd)。
  • 示例输出
    COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
    bash    1234 user  cwd    DIR  8,1     4096 1234 /home/user
    

4.12 查找导致磁盘空间未释放的“幽灵文件”

查找所有被删除但仍被占用的文件,并提取关键信息:

lsof | grep deleted | awk '{print $2,$4,$9}' | sort -u
  • 说明
    • grep deleted:过滤标记为 (deleted) 的文件。
    • awk '{print $2,$4,$9}':提取 PID、文件描述符和文件名。
    • sort -u:去重输出。
  • 示例输出
    5678 10w /tmp/deleted.log
    
  • 用途:用于排查磁盘空间未释放问题,可通过终止相关进程(如 kill <PID>)释放空间。

5. 高级技巧

5.1 跟踪文件访问(结合 strace

跟踪命令 <command> 的文件访问行为(需 root 权限):

strace -f -e trace=file <command>
  • 说明
    • -f:跟踪子进程。
    • -e trace=file:仅跟踪文件相关系统调用。
  • 示例:跟踪 cat 命令的文件访问:
    sudo strace -f -e trace=file cat /tmp/test.txt
    

5.2 查找指定目录下所有打开的文件

查找 /var/log 目录下被进程打开的文件:

lsof +D /var/log
  • 说明+D 递归列出指定目录及其子目录中被打开的文件。

5.3 限制输出到特定协议

列出所有 IPv4 网络连接:

lsof -i 4

列出所有 IPv6 网络连接:

lsof -i 6

5.4 周期性监控

持续监控端口 80 的占用情况:

watch -n 1 "lsof -i :80"
  • 说明watch -n 1 每秒刷新一次输出。

6. 验证和调试

  • 过滤输出lsof 输出可能很长,使用 grepawk 过滤:
    lsof -i TCP | grep LISTEN
    
  • 分页查看:结合 lessmore 处理大量输出:
    lsof -u apache | less
    
  • 检查命令状态:确认 lsof 执行是否成功:
    echo $?
    
    • 0:成功。
    • 1:无匹配结果(可能正常)或错误。

7. 注意事项

  • 权限问题:部分系统文件或进程信息需 root 权限:
    sudo lsof -i :80
    
  • 性能影响lsof 扫描所有打开文件可能消耗资源,特别是在大量进程或文件系统上。建议使用具体条件(如 -p-i)缩小范围。
  • 已删除文件:被删除但仍被占用的文件(deleted)会导致磁盘空间未释放,可通过终止进程或重启服务释放。
  • 网络连接-i 选项支持多种格式,如 -i TCP:80-i @192.168.1.100(指定 IP)。
  • 跨平台差异:不同 Linux 发行版或 Unix 系统(如 macOS)的 lsof 选项可能略有不同,建议查看 man lsof

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/942775.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Day1文本格式化标签

用来为文本添加特殊格式,突出重点,常见的文本格式有:加粗,下划线,倾斜,删除线等在实际应用中,一般都是使用左边的标签,因为其在语义上自带强调含义 <!DOCTYPE html> <html lang="en"> &l…

24信计2班 17曾向嵩 pytorch66页实验题

import torch from torch import optim, nn from torchvision import datasets, transforms from torch.utils.data import DataLoader import torch.nn.functional as Fdevice = torch.device(cuda if torch.cuda.is_…

解答这些常见的智能合约安全问题,并提供相应的防护措施

我来详细解答这些常见的智能合约安全问题,并提供相应的防护措施: 1. 重入攻击 (Reentrancy Attack) 攻击原理 重入攻击是指恶意合约在接收以太币后,立即回调发送方合约,导致状态不一致。 攻击示例 // 易受攻击的合…

读AI赋能05消费者盈余

读AI赋能05消费者盈余1. 肖莎娜朱布夫 1.1. Shoshana Zuboff 1.2. 哈佛商学院荣誉退休教授 1.3. 《监控资本主义》1.3.1. 2019年最佳图书之1.3.2. 谷歌和Facebook等公司用一种“感知化、网络化、计算化的基础设施”取代…

解答这些 Solidity 开发中的重要问题

我来详细解答这些 Solidity 开发中的重要问题: 1. Calldata 的含义和使用场景 Calldata 定义 calldata 是函数参数的存储位置,专门用于存储外部函数调用的参数数据。 使用场景 contract CalldataExample {// 1. 外部…

Day1排版标签,标题与段落

标题标签一般在新闻标题,文章标题等内容上使用,且是双标签,标签名为h1~h6,而h1标签在一个网页中只能用一次,一般用来放新闻标题或网页logo,其余标题标签则无次数限制、 各级标题标签的字号都会加粗,等级越大,字…

梦回大唐王一牛

梦回大唐王一牛英雄不装车. 爱国者,坦克都贴边建.要塞满医疗车.

grpc 哼哈二将,你值得拥有

kong网关转发http服务,各大博主都已经聊包浆了。 kong网关原生支持代理gRPC请求,本文通过一个示例来记录通过kong网关管理gRPC服务,并且使用grpcbin和grpcurl哼哈二将来模拟和验证grpc服务能力。kong网关核心的控制…

一文读懂字体文件

一文读懂字体文件这篇文章是从0到1自定义富文本渲染的原理篇之一,此外你还可能感兴趣: 更多内容欢迎关注公众号:非专业程序员Ping一文读懂字符与编码 一文读懂字符、字形、字体 一文读懂字体文件 从0到1自定义文字排…

解释这些 Solidity 智能合约的核心概念

我来详细解释这些 Solidity 智能合约的核心概念: 1. 合约生命周期 合约部署阶段 // 1. 合约创建 contract MyContract {// 2. 状态变量初始化uint256 public value;address public owner;// 3. 构造函数执行construct…

你的项目一团糟-不是你的错-是框架的锅

GitHub 主页 你的项目一团糟?不是你的错,是框架的“锅”!📂➡️🏛️ 每个程序员都经历过那个瞬间。你加入一个新项目,或者时隔半年重新打开一个自己写的项目,然后,你感到了那种熟悉的、令人窒息的混乱。🌪…

别再猜了-开始测量吧-一份实用的Web性能指南

GitHub 主页 别再猜了,开始测量吧:一份实用的 Web 性能指南 又是一年“黑五”,凌晨三点,我的手机像疯了一样尖叫起来。😱 不是闹钟,是监控警报。我们的主打电商服务,那个我们花了半年心血构建的系统,在流量洪…

你的错误处理一团糟-是时候修复它了-️

GitHub 主页 你的错误处理一团糟,是时候修复它了!🛠️ 我还记得那个让我彻夜难眠的 bug。一个支付回调接口,在处理一个罕见的、来自第三方支付网关的异常状态码时,一个Promise链中的.catch()被无意中遗漏了。结果…

[网络] [iproute2] tc: Linux 带宽限制(Token Bucket Filter 和 HTB)使用指南

[网络] [iproute2] tc: Linux 带宽限制(Token Bucket Filter 和 HTB)使用指南$(".postTitle2").removeClass("postTitle2").addClass("singleposttitle");参考:iproute2: 网络管理利…

C++编程练习

// 阿汪面前有两只盲盒,每只盒子打开都有两种可能:或者装了 X 克狗粮,或者是一只容量为 Y 克的狗粮储蓄盒。如果是狗粮,阿汪可以快乐地吃掉;如果是空储蓄盒,那就倒霉了,阿汪必须想办法找到狗粮把这只储蓄盒装满…

newDay14

1.做了几个Java的小练习,背背单词,写了一些英语作业,时间还是不太够 2.明天课就少了,继续往下学 3.自己c++还是太差了,java学得差不多就回去补c++

L07_在RuoYI项目中添加自己的接口并实现CRUD功能(轻松+AI版)

这里是废话部分 从来没有写过如此轻松的作业,上课两个多小时就听进去了几分钟的东西,这几分钟的东西还是操作,其他是半点都没入入脑,靠着这几分钟的东西,轻松的完成了作业的1/2。 在L06中折磨的看了三天的文档,大…

大二to大三暑假大三上前半学期总结

比赛,学习,刚谈上恋爱,可是然后呢?其实心态得到了比较大的改变,比大二下的时候好受了很多,可能是逐渐接收了事实了。 比较大的事情其实也没几个,第一是和同学一起去打了一个超算比赛 是并行应用挑战赛2025,去鄂…

带权拉格朗日中值定理的证明

带权拉格朗日中值定理:设 \(f(x)\) 在 \([a, b]\) 连续,且 \(g(x)\) 在 \([a,b]\) 可积且不变号(恒大于零或恒小于零),那么存在 \(c\in [a,b]\),使得 \[\int^b_af(x)g(x)\text{d}x = f(c)\int^b_ag(x)\text{d}x …