【工具】lsof 的使用

本文涉及的产品
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS Agent(兼容OpenClaw),2核4GB
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介:
(list open files) 是一个列出当前系统打开文件的工具!
原理:
在linux环境下,任何事物都以文件的形式存在,系统在后台都为应用程序分配了一个对应的文件描述符,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因此通过lsof工具能够查看应用程序打开文件的描述符列表,以便查看应用程序的信息!
用法以及含义:
losf 的语法:
lsof [options] filename
如果不使用参数的话,默认显示所有进程打开的所有文件。
[root@rac3 ~]# lsof | more
COMMAND     PID      USER   FD      TYPE             DEVICE       SIZE       NODE NAME
init          1      root  cwd       DIR                8,3       4096          2 /
init          1      root  rtd       DIR                8,3       4096          2 /
init          1      root  txt       REG                8,3      43496    2450664 /sbin/init
init          1      root  mem       REG                8,3      95464    1764613 /lib64/libselinux.so.1
init          1      root   10u     FIFO               0,17                  1204 /dev/initctl
migration     2      root  cwd       DIR                8,3       4096          2 /
migration     2      root  rtd       DIR                8,3       4096          2 /
migration     2      root  txt   unknown                                          /proc/2/exe
rpc.statd  2567      root    0u      CHR                1,3                  1432 /dev/null
sdpd       2643      root    2u      CHR                1,3                  1432 /dev/null
oracle    10970    oracle   17u     IPv6              21324                       UDP rac3:30005
sdpd       2643      root    4u     sock                0,5                  7350 can t identify protocol
sdpd       2643      root    5u     unix 0xffff81012e52e380                  7358 /var/run/sdp
rpc.statd  2567      root    4w     FIFO                0,6                  7128 pipe
rpc.statd  2567      root    5u     unix 0xffff81013f84cb80                  7131 socket
rpc.statd  2567      root    7u     IPv4               7218                   TCP *:3com-amp3 (LISTEN)

lsof输出各列信息的意义如下:
COMMAND:进程的名称!
PID:    进程标识符!
USER:   进程所有者!
FD:     文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等!
TYPE:   文件类型,如DIR、REG,MEM等!
DEVICE: 指定磁盘的名称!
SIZE:   文件的大小!
NODE:   索引节点(文件在磁盘上的标识)!
NAME:   打开的文件名称 !

FD 列中的文件描述符意义:
cwd  表示应用程序的当前工作目录,也是该应用程序启动的目录,除非它本身对这个目录进行更改。
txt  表示该类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的/sbin/init程序。
数值 表示应用程序的文件描述符,打开该文件时返回的整数。如上的最后一行文件/dev/initctl,其文件描述符为 10;/dev/null的描述符为2!
u    表示该文件被打开并处于读取/写入模式,而不是只读(r)或只写(w)模式。大写的W表示该应用程序具有对整个文件的写锁。该文件描述符用于确保每次只能打开一个应用程序实例!
初始打开每个应用程序时,都具有三个文件描述符,从0到2,分别表示标准输入、输出和错误流。所以大多数应用程序所打开的文件的FD都是从3开始。

Type 列中的文件描述符意义:
REG  表示文件
DIR  表示目录
CHR  表示字符设备
BLK  表示和块设备
UNIX 表示UNIX 域套接字
FIFO 表示先进先出(FIFO)队列
IPv4 表示网际协议(IP)套接字。

了解了lsof的原理,那losf到底有什么用呢?下面介绍losf的用处
1 查看端口的使用 比如1521,查看有多少机器建立了与当前机器oracle数据库的连接! 
oracle@rac3:/home/oracle>lsof -i :1521 | more
COMMAND   PID   USER   FD   TYPE  DEVICE SIZE NODE NAME
oracle    329 oracle   13u  IPv4 6167257       TCP dba-host1.hz.ali.com:1521->10.250.3.44:44782 (ESTABLISHED)
oracle    331 oracle   15u  IPv4 6167274       TCP dba-host1.hz.ali.com:1521->10.250.3.56:45332 (ESTABLISHED)
oracle    515 oracle   15u  IPv4 6167700       TCP dba-host1.hz.ali.com:1521->10.250.3.47:43180 (ESTABLISHED)
oracle   1436 oracle   15u  IPv4 6169854       TCP dba-host1.hz.ali.com:1521->10.249.196.131:39527 (ESTABLISHED)
oracle   1468 oracle   15u  IPv4 6169968       TCP dba-host1.hz.ali.com:1521->10.250.3.34:52021 (ESTABLISHED)
oracle   1470 oracle   15u  IPv4 6169977       TCP dba-host1.hz.ali.com:1521->10.250.3.34:52022 (ESTABLISHED)
查看mysql的3306  rac3-->rac4 是一个主从架构
[root@rac3 ~]# lsof -i :3306 
COMMAND  PID  USER   FD   TYPE DEVICE SIZE NODE NAME
mysqld  3181 mysql   12u  IPv6   8063       TCP *:mysql (LISTEN)
mysqld  3181 mysql   39u  IPv6   8070       TCP rac3:mysql->rac4:36554 (ESTABLISHED)
2 查看某个用户打开的类型mem的文件:
[root@rac3 ~]#  lsof -a -u oracle -d mem | more
COMMAND   PID   USER  FD   TYPE DEVICE     SIZE    NODE NAME
bash     9625 oracle mem    REG    8,3   139416 1764595 /lib64/ld-2.5.so
bash     9625 oracle mem    REG    8,3  1713160 1764596 /lib64/libc-2.5.so
bash     9625 oracle mem    REG    8,3    23360 1764602 /lib64/libdl-2.5.so
bash     9625 oracle mem    REG    8,3    15584 1764624 /lib64/libtermcap.so.2.0.8
bash     9625 oracle mem    REG    8,3    53880 1764315 /lib64/libnss_files-2.5.so
bash     9625 oracle mem    REG    8,3 56462864 4447583 /usr/lib/locale/locale-archive
bash     9625 oracle mem    REG    8,3    25464 4541667 /usr/lib64/gconv/gconv-modules.cache
oracle  10970 oracle mem    REG   0,20 16777216   21166 /dev/shm/ora_yangdb_98305_0
oracle  10970 oracle mem    REG   0,20        0   21167 /dev/shm/ora_yangdb_98305_1
oracle  10970 oracle mem    REG   0,20        0   21168 /dev/shm/ora_yangdb_98305_2
oracle  10970 oracle mem    REG   0,20        0   21169 /dev/shm/ora_yangdb_98305_3
...省略...
3 查看那些程序在使用某个文件:
[root@rac3 ~]# lsof /opt/mysql/data/
COMMAND  PID  USER   FD   TYPE DEVICE SIZE    NODE NAME
mysqld  3181 mysql  cwd    DIR    8,3 4096 2842467 /opt/mysql/data/
4 恢复误删除的文件:
os 原理:
    当进程打开了某个文件时,只要该进程保持打开该文件,即使将其删除,它依然存在于磁盘中。这意味着,进程并不知道文件已经被删除,它仍然可以向打开该文件时提供给它的文件描述符进行读取和写入。除了该进程之外,这个文件是不可见的,因为已经删除了其相应的目录索引节点。
    在/proc 目录下,其中包含了反映内核和进程树的各种文件。/proc目录挂载的是在内存中所映射的一块区域,所以这些文件和目录并不存在于磁盘中,因此当我们对这些文件进行读取和写入时,实际上是在从内存中获取相关信息。
    大多数与lsof相关的信息都存储于以进程的PID命名的目录中,即/proc/123中包含的是 PID为123的进程的信息。
这里引用一个kamus的文章《 Linux/Unix恢复误删除的文件恢复》,此文比较详细的介绍了具体的恢复步骤,同时也告诉我们对于数据库的操作一定要谨慎小心!
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
算法 搜索推荐 计算机视觉
图片相似度计算及检索调研
图片相似度计算和相似图片搜索,是图片识别领域两个常见的应用场景。例如搜索相似商品,和相似的图片,在百度、淘宝中都有应用。在某些业务中,也存在对图片相似度的计算和判断。因此,在这里简单介绍一下相关算法。
2928 0
|
人工智能 自然语言处理 API
阿里云百炼产品月刊【2025年3月】
2025年3月的阿⾥云百炼平台月刊突出展示了其在AI模型和服务上的显著进展。本期亮点包括推出了多个先进的多模态模型,如qwen2.5-omni-7b和视觉推理模型qvq-max系列,大幅提升了文本、图像、语音和视频的处理能力,并降低了计算成本。此外,平台引入了精准的语音识别和翻译模型gummy-realtime-v1及gummy-chat-v1,支持多语言实时交互。为了促进应用开发,阿里云百炼平台还发布了开源推理模型qwq-32b,以及一系列优化的智能体应用模型,增强了自动化和交互性。最后,通过新增周边查询插件和基于MCP的析⾔服务,进一步扩展了平台的功能和服务范围。
1555 8
|
机器学习/深度学习 JSON 算法
京东拍立淘图片搜索 API 接入实践:从图像识别到商品匹配的技术实现
京东拍立淘图片搜索 API 是基于先进图像识别技术的购物搜索接口,支持通过上传图片、URL 或拍摄实物搜索相似商品。它利用机器学习和大数据分析,精准匹配商品特征,提供高效、便捷的搜索体验。接口覆盖京东海量商品资源,不仅支持外观、颜色等多维度比对,还结合用户行为数据实现智能推荐。请求参数包括图片 URL 或 Base64 编码,返回 JSON 格式的商品信息,如 ID、价格、链接等,助力消费者快速找到心仪商品,满足个性化需求。
868 18
|
10月前
|
人工智能 自然语言处理 算法
提升LangChain开发效率:10个被忽视的高效组件,让AI应用性能翻倍
LangChain作为主流大语言模型应用框架,其高级组件常被忽视。本文详解10个高价值但低使用率的核心组件,如语义检索、多模板路由、智能查询转换等,结合技术原理与实践案例,助开发者构建更高效、智能、适应性强的AI系统,提升应用性能与业务价值。
655 0
|
存储 监控 前端开发
如何实现前端框架数据驱动方式的数据加密存储?
实现前端框架数据驱动方式的数据加密存储需要综合考虑多个因素,包括加密算法的选择、密钥管理、传输安全、服务器端处理等。通过合理的设计和实施,能够有效提高数据的安全性,保护用户的隐私和敏感信息。但需要注意的是,前端加密存储不能完全替代后端的安全措施,后端的安全防护仍然是不可或缺的。
530 53
|
9月前
|
Ubuntu Linux 网络安全
Linux装软件神器:yum 超详细入门指南
在Linux中安装软件有三种常用方法:源码安装、rpm包安装和yum包管理器安装。其中,**yum**(或Ubuntu的apt)最为便捷,类似于手机应用商店,能自动解决依赖问题,适合新手使用。本文详细介绍了yum的工作原理、软件源配置、常用命令及生态系统的意义,帮助用户快速上手Linux软件安装与管理。
 Linux装软件神器:yum 超详细入门指南
|
前端开发 关系型数据库 MySQL
PHP与MySQL动态网站开发实战指南####
【10月更文挑战第21天】 本文将深入浅出地探讨如何使用PHP与MySQL构建一个动态网站,从环境搭建到项目部署,全程实战演示。无论你是编程新手还是希望巩固Web开发技能的老手,都能在这篇文章中找到实用的技巧和启发。我们将一起探索如何通过PHP处理用户请求,利用MySQL存储数据,并最终呈现动态内容给用户,打造属于自己的在线平台。 ####
742 0
|
缓存 索引 Python
Transformers 4.37 中文文档(十六)(1)
Transformers 4.37 中文文档(十六)
646 1
|
SQL 关系型数据库 数据库
|
安全 Java API
【Java】已解决java.lang.SecurityException异常
【Java】已解决java.lang.SecurityException异常
2738 0