Linux文件与进程交互的窥探者lsof

lsof 是一个 Linux 和 UNIX 系统中的实用工具,用于列出系统中打开文件的所有信息。这个名字代表 “List Open Files”,但它也可以显示进程相关的其他信息,如:

打开的文件描述符列表
打开网络连接的列表
被进程使用的信号和内核对象等

在Linux系统中,有一个经典的概念:
一切皆文件”(Everything is a file),而lsof是一个列出当前系统打开文件的工具。这个命令可以列出被进程打开的文件、网络连接、设备、文件描述符等信息,帮助用户了解系统资源的使用情况。

命令及常用参数
语法格式:lsof [options] filename

1.1 常用参数

-p<进程PID>: 输出指定pid的进程打开的文件;-l:使用用户ID代替输出中的用户名;-u<用户名> : 输出指定用户打开的文件;-c <字符串>: 过滤出 COMMAND 列中包含 指定字符的记录;-d<文件描述符>: 输出包含指定文件描述符(FD列)的项;-n :禁止解析主机名;-i : 输出符合指定条件的项-i [4|6] :分别指 IPv4、IPv6-i [TCP|UDP]:指 TCP 或 UDP连接;-i @[hostname |hostaddr]:指 主机名或地址;-i:port : 端口号,可以是多个。

1.2 输出列含义

在这里插入图片描述

常用场景
2.1 监控主机当前打开文件句柄总量

当Linux系统中的文件句柄数量达到上限时,可能会引发一系列风险和问题,如程序崩溃、系统资源耗尽、主机性能下降等。

以suse系统为例:

#/bin/bash
#################文件句柄监控###################
#####全局变量#####
threshold_value_user="40000"
threshold_value_system="50000"
username=`whoami`
ip_addr=`ip addr show | grep 'inet ' | grep -v '127.0.0' | awk '{print $2}' | cut -d/ -f1|head -1`
#####判断当前主机系统版本#####
system_version=`cat /etc/SuSE-release|grep VERSION|awk -F"=" '{print $2}'`
system_leven=`cat /etc/SuSE-release|grep PATCHLEVEL|awk -F"=" '{print $2}'`
##根据系统信息执行句柄数统计命令
if [ ${system_version} -eq 12 -a ${system_leven} -ge 4 ];thenhandle_user=`lsof -Ki -u ${username}|wc -l`handle_system=`lsof -Ki|wc -l`
elsehandle_user=`lsof -u ${username}|wc -l`handle_system=`lsof|wc -l`
fi
#####告警发送#####
if [ ${handle_user} -ge ${threshold_value_user} ];then
msg1="【告警】:${ip_addr};${username}用户下的文件句柄数量达到${handle_user},请核查!"
fiif [ ${handle_system} -ge ${threshold_value_system} ];thenmsg2="【告警】:${ip_addr}系统文件句柄数总量达到${handle_system},请核查!"
fi
……

以centos为例子:

在 CentOS 上,你可以使用 lsof 命令结合其他工具来监控主机当前打开的文件句柄总量。但是,需要注意的是,lsof 本身并不直接提供一个选项来显示打开的文件句柄总量。不过,你可以通过一些间接的方法来获取这个信息。一种方法是使用 lsof 命令结合 wc(word count)命令来统计打开的文件句柄数量。例如:bash
lsof | wc -l
这个命令会列出所有打开的文件,并使用 wc -l 来计算行数。请注意,这个方法可能会包括一些额外的行,比如标题行,所以得到的结果可能会比实际的文件句柄数量稍高一些。另一种更精确的方法是使用 /proc/sys/fs/file-max 文件来查看系统允许的最大文件句柄数量,以及 /proc/sys/fs/file-nr 文件来查看当前已分配的文件句柄数量。例如:bash
cat /proc/sys/fs/file-nr
这个命令会输出三个值,分别是:已分配的文件句柄数量
已分配但尚未使用的文件句柄数量
系统允许的最大文件句柄数量
你关注的是第一个值,即已分配的文件句柄数量。这个值表示当前系统中所有进程打开的文件句柄总数。如果你想要实时监控这个值,你可以使用 watch 命令来周期性地运行上述命令并查看结果:bash
watch -n 1 cat /proc/sys/fs/file-nr
这个命令会每秒更新一次输出,让你能够实时看到文件句柄数量的变化。

2.2 查找文件句柄未释放进程以及文件恢复

日常运维中经常遇到磁盘空间被占用,du查看文件实际大小小于文件系统使用率,此现象一般文件句柄未释放导致,可以通过lsof查找指定进程后,重启释放空间;

查找文件句柄未释放:

lsof |grep delete |sort -k7 -nr |head -20

删除文件恢复:

上述句柄未释放的文件,也可手动恢复:通过lsof找出需要恢复的文件信息,根据信息中的PID和FD信息,找到/proc/${PID}/${FD}下的文件,在重定向恢复文件即可。

图片

卸载文件系统时繁忙无法卸载,也可通过lsof查出进程占用,通过停止对应进程后再进行卸载。

2.3 常用查找进程与文件命令

查看指定文件被哪些进程打开:lsof /path/file查看指定端口被什么进程占用:lsof -i:protNumber查看指定用户打开的文件:lsof -u username查看指定进程打开的文件:lsof -p pid查看指定目录下被打开的文件:lsof +D /path/directory查看套接字和网络连接:lsof -i
列出所有打开的文件:lsof
列出特定进程打开的文件:lsof -p <进程ID>
列出特定用户打开的文件:lsof -u <用户名>
列出特定文件被哪些进程使用:lsof /path/to/file
列出特定网络端口被哪些进程使用:lsof -i :<端口号>
列出特定进程使用的信号:lsof -p <进程ID> | grep REG

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

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

相关文章

新手学python还是c?

考虑到个人情况和职业规划是非常重要的。我这里有一套编程入门教程&#xff0c;不仅包含了详细的视频讲解&#xff0c;项目实战。如果你渴望学习编程&#xff0c;不妨点个关注&#xff0c;给个评论222&#xff0c;私信22&#xff0c;我在后台发给你。 Python作为初学者入门语言…

GTS fail之GtsPackageSignatureTest和GtsApexSignatureVerificationTest

目录 1. Fail项具体详情 2. Google为何增加测试项 3. 解决方法 1. Fail项具体详情 run gts -m GtsPackageSignatureTest -t android.security.cts.PackageSignatureTest#testPackageSignatures fail TestResultDetailsandroid.security.cts.PackageSignatureTest#testPacka…

正弦实时数据库(SinRTDB)的使用(7)-历史统计查询

前文已经将正弦实时数据库的使用进行了介绍&#xff0c;需要了解的可以先看下面的博客&#xff1a; 正弦实时数据库(SinRTDB)的安装 正弦实时数据库(SinRTDB)的使用(1)-使用数据发生器写入数据 正弦实时数据库(SinRTDB)的使用(2)-接入OPC DA的数据 正弦实时数据库(SinRTDB)…

前端:注册页面

效果 代码 index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevi…

单元最短路模板 dijkstra以及SPFA的FAQ

单源最短路 首先先看两道题目&#xff1a; Luogu P3371 【模板】单源最短路径&#xff08;弱化版&#xff09; Luogu P4779 【模板】单源最短路径&#xff08;标准版&#xff09; 两道题目都是求最小单元最短路。 使用Dijkstra两道题目均可以通过&#xff0c;但是如果使用SPFA…

Redis面试题汇总

目录 一、动力节点Redis的书 7. Redis持久化 二、马士兵李瑾老师 2.1 Redis高级特性和应用 1&#xff09;发布订阅&#xff1a; 2&#xff09;Stream 延伸&#xff1a;Redis中几种消息队列实现的总结 3&#xff09;慢查询 4&#xff09;Pipeline流水线 5&#xff09;…

新发现!科学家最新成果:补充类“原知因起源金”物质可延长寿命23%

近日&#xff0c;美哥伦比亚大学Vijay Yadav团队在《Science》发布了一项重磅级成果&#xff1a;通过补充一种特殊氨基酸&#xff08;带有磺酸基团的全能抗衰物质&#xff09;&#xff0c;竟然惊人地将实验动物的寿命延长了23%。 而其背后的机制&#xff0c;与早已火爆电商圈的…

Pygame基础9-射击

简介 玩家用鼠标控制飞机&#xff08;白色方块&#xff09;移动&#xff0c;按下鼠标后&#xff0c;玩家所在位置出现子弹&#xff0c;子弹匀速向右飞行。 代码 没有什么新的东西&#xff0c;使用两个精灵类表示玩家和子弹。 有一个细节需要注意&#xff0c;当子弹飞出屏幕…

erp系统开发报价:企业如何选择一套合适的智能erp管理系统-亿发

在选择ERP系统时&#xff0c;企业通常希望了解上一套系统到底需要多少资金&#xff0c;但实际上这个问题并没有一个明确的答案。一般的erp系统从几万到几百万不等&#xff0c;一些简单的erp系统甚至只需要几千元。ERP系统的价格取决于多种因素&#xff0c;包括企业的业务规模、…

vs2022断点找bug出错(打上100个断点)

初步分析&#xff1a;故障出自-具体功能模块 进一步分析&#xff1a;故障出自-该功能代码流程 进一步分析&#xff1a;从该功能起点-终点&#xff0c;一路打100个断点

【学习笔记】java项目—苍穹外卖day03

文章目录 苍穹外卖-day03课程内容1. 公共字段自动填充1.1 问题分析1.2 实现思路1.3 代码开发1.3.1 步骤一1.3.2 步骤二1.3.3 步骤三 1.4 功能测试1.5 代码提交 2. 新增菜品2.1 需求分析与设计2.1.1 产品原型2.1.2 接口设计2.1.3 表设计 2.2 代码开发2.2.1 文件上传实现2.2.2 新…

想要做好自动化测试,离不开这5点!

最近小编在逛技术交流社区&#xff0c;在一条讨论自动化测试落地面临的痛点及可以创造的价值下面&#xff0c;有这样一条回复颇有感触&#xff0c;分享如下&#xff1a; 如果你让两个相互不认识、来自不同公司的测试工程师自由讨论&#xff0c;我猜他两寒暄的第一个问题会是&a…