Linux系统句柄问题分析----linux系统文件删除后,空间却不释放原因分析

Linux下 文件删除但是空间未被释放 或者 磁盘已满但找不到对应的大文件 的解决方案 linux磁盘空间已满,手动rm -rf 删除了大文件之后,df -h 查看一下发现空间占用还是不变,有时候会想rm -rf 删除只是逻辑删除到回收站一样?其实不然,通常这种情况都是文件被删除,但是还被进程占用,因此删除文件空间未释放通常的建议是kill 掉对应的进程,但是如果是生成环境,不能轻易kill进程的话,可以通过置空文件的方式来释放空间通过lsof | grep deleted 找到未能删除掉的文件,确定占用的进程号。 阅读详情
AI摘要

本文深入解析Linux系统中的文件句柄概念,探讨句柄与文件描述符的区别,以及句柄在进程管理中的作用。文章详细介绍了lsof命令的使用,用于监控和诊断系统中文件句柄的使用情况,同时提供了调整句柄限制和优化文件删除策略的方法。

Linux系统句柄问题分析

1 概念

  1. 句柄就是一个对象的标识符,只要获得对象的句柄,我们就可以对对象进行任意的操作,包括窗口,按钮,图标,输出设备,控件或者文件等;
  2. 句柄是一种特殊的智能指针,用一个唯一的整数值标识一个对象(即编号),并不指向实际的内核对象,而是内核对象的虚拟地址;
  3. 只有Windows中才有句柄,Windows中的句柄是指针的指针,因为windows中对象的经常会在内存中移动,所以地址值经常会变,所以就对外提供一个指针的指针即句柄给用户,句柄的地址是不会变的。
  4. Linux中是没有文件句柄的,只有文件描述符,只是大家习惯把它说成句柄,Linux中, 每当进程打开一个文件时,系统就为其分配一个唯一对应的整型文件描述符,用来标识这个文件;

在linux系统中,想要彻底的删除一个文件,取决于两个“计数器”,这两个计数器一个是磁盘引用的“计数器”(记录了这个文件有几个硬链接),另一个则是内存引用的“计数器”(纪录了这个文件正在被几个进程所调用),当这两个“计数器”全部为0,也就是这个文件没有硬链接,没有任何进程在调用的时候,这个文件才会真正的被删除。

可能原因:

  1. 该文件已经建立硬链接
    这个原因很简单,hardlink是指多个文件名指向同一索引点(inode),只要其中仍然存在一个硬链接都文件内存都不会释放,所以文件具有硬链接是原因之一。
  2. 系统中有进程正在使用该文件
    这个原因解释起来也很简单,如果系统中有进程使用该文件,删除该文件后如果内存释放,则进程会自动结束,造成无法预测的后果。
  3. 磁盘空余空间出现问题
    这个问题原因就很复杂了,既有物理磁盘损坏又有些磁盘内部分配问题。这里提供一个可能,大家都知道LINUX文件系统是通过inode索引文件管理blocks区域,如果文件中的inode节点被用完了,则无法分配新空间。

2 linux lsof命令

lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。
lsof输出各列信息的意义如下:
COMMAND:进程的名称 PID:进程标识符
USER:进程所有者
FD:文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等 TYPE:文件类型,如DIR、REG等
DEVICE:指定磁盘的名称
SIZE:文件的大小
NODE:索引节点(文件在磁盘上的标识)
NAME:打开文件的确切名称
在这里插入图片描述

3 查看与修改句柄:

在linux系统中可以通过ulimit–n查看每个进程限制的最大句柄数,通过ulimit –HSn 10240修改进程的最大句柄数。当句柄数目达到限制后,就回出现”too many files open”。
查看进程占用的句柄数有几种办法:

  1. 通过cat /proc/pid/fd可以查看线程pid号打开的线程;
  2. 通过lsof命令, /usr/sbin/lsof-p 21404

4 解决方案

1 系统默认的ulimit对文件打开数量的限制是1024,修改/etc/security/limits.conf并加入以下配置,永久生效

  • soft nofile 65535
  • hard nofile 65535
    硬限制是实际的限制,而软限制,是warnning限制,超过这个数值只会做出warning
    注:
    1)这个限制是针对单个程序的限制
    2) 这个限制不会改变之前已经运行了的程序的限制
    在这里插入图片描述
    2 查找文件句柄问题的时候,还有一个很实用的程序lsof。可以很方便看到某个进程开了那些句柄,也可以看到某个文件/目录被什么进程占用了。
    例如分析句柄数,查找原因,这是解决问题最根本的办法。那么如何分析那,就需要用到lsof这个命令了
    (1) 统计各进程打开句柄数:lsof -n|awk ‘{print $2}’|sort|uniq -c|sort –nr
    在这里插入图片描述
    (2) 统计各用户打开句柄数:lsof -n|awk ‘{print $3}’|sort|uniq -c|sort -nr
    在这里插入图片描述
    (3) 统计各命令打开句柄数:lsof -n|awk ‘{print $1}’|sort|uniq -c|sort –nr
    在这里插入图片描述
  1. 系统中还有一个/proc/sys/file-max的文件, 表示系统所有进程一共可以打开的文件数量
    通常这个系统限制是Linux系統在启动时候根据系統硬件资源状况计算出来的最佳的最大同時打开文件数限制,如果沒有特殊需要,不应该修改此限制,除非想为用户级打开文件数限制设置超过此限制的值。

修改方法如下
方法一:

 echo  6553560 > /proc/sys/fs/file-max

方法二:

/etc/sysctl.conf, 加入fs.file-max = 6553560

执行如下命令生效:

sysctl -p 

另外还有一个常用命令,/proc/sys/fs/file-nr,可以看到整个系统目前使用的文件句柄数量

可以执行自动脚本如下

sed -i -e '44 i * soft nofile 65535' -e '44 i * hard nofile 65535' /etc/security/limits.conf
echo  6553560 > /proc/sys/fs/file-max

4 这里首先说明一下服务器的一些删除策略,由于Linux没有回收站功能,我们的线上服务器所有要删除的文件都会首先移动到系统/tmp目录下,然后定期清除/tmp目录下的数据。这个策略本身没有问题,但是通过检查发现这台服务器的系统分区中并没有单独划分/tmp分区,这样/tmp下的数据其实是占用了根分区的空间。

5 一个文件在文件系统中的存放分为两个部分:数据部分和指针部分,指针位于文件系统的meta-data中,数据被删除后,这个指针就从meta-data中清除了,而数据部分存储在磁盘中,数据对应的指针从meta-data中清除后,文件数据部分占用的空间就可以被覆盖并写入新的内容,之所以出现删除access_log文件后,空间还没释放,就是因为httpd进程还在一直向这个文件写入内容,导致虽然删除了access_log文件,但文件对应的指针部分由于进程锁定,并未从meta-data中清除,而由于指针并未被删除,那么系统内核就认为文件并未被删除,因此通过df命令查询空间并未释放也就不足为奇了。

在这里插入图片描述

解决这一类问题的方法有很多种,最简单的方法是关闭或者重启httpd进程,当然也可以重启操作系统,不过这并不是最好的方法,对待这种进程不停对文件写日志的操作,要释放文件占用的磁盘空间,最好的方法是在线清空这个文件,可以通过如下命令完成:
echo " " >/tmp/acess.log
通过这种方法,磁盘空间不但可以马上释放,也可保障进程继续向文件写入日志,这种方法经常用于在线清理Apache、Tomcat、Nginx等Web服务产生的日志文件。

linux文件删除但空间不释放 使用查找被删除但仍被进程占用的文件。使用sync刷新文件系统缓存。使用fsck检查和修复文件系统错误。定期清理系统日志和临时文件。确保没有挂载的文件系统或临时文件占用空间。 阅读详情

相关推荐

1 linux中解决文件已rm删除但空间不释放的案例

1、错误现象 运维的监控系统发来通知,报告一台服务器空间满了,登录服务器查看,根分区确实没有空间了: [root@localhost ~]# df -h 这里首先说明一下服务器的一些删除策略,由于Linux没有回收站功能,所以线上服务器上所有要删除的文件都会先移动到系统/tmp目录下,然后定期清除/tmp目录下的数据。这个策略本身没有问题,但是通过检查发现这台服务器的系统分区中并没有单独划分/tmp分区,这样/tmp下的数据其实占用了根分区的空间。既然找到了问题,那么删除/tmp目录下一些占空间较大的数据

qq_40907977的博客 8710

Linux文件句柄耗尽排查实践

但真正的根因,往往不在“文件”本身,而在于进程、连接、日志和系统限制之间的关系。因此,句柄耗尽并不意味着某程序真的打开了成千上万个文本文件,它也可能是打开了大量网络连接、日志流或临时对象。成熟的做法,不是等应用报错后临时加大 nofile,而是提前根据服务模型设计合理限制,并对连接数、句柄数和异常增长趋势建立监控。Linux 文件句柄耗尽排查的核心,在于把系统限制、进程行为和连接模式联系起来看。另一个高频场景,是服务在日志轮转后仍持有旧文件句柄,或者频繁打开新文件却不关闭。这个方法虽然简单,但很有效。

sillyoung的博客 253

用Python爬取公众号历史所有文章,看这篇就够了

手把手教你爬取公众号历史所有文章

u010522887的专栏 1万+

linux文件句柄,【LINUX】使用lsof处理文件恢复、句柄以及空间释放问题

曾经在生产上遇到过一个df 和 du出现的结果不一致的问题,为了排查到底是哪个进程占用了文件句柄,导致空间未释放,首先在linux上面,一切皆文件,这个问题可以使用lsof这个BT的命令来处理(这个哈还可以来查询文件句柄泄露问题,应用程序的进程未关闭文件句柄)1.文件句柄以及空间释放问题注:在生产环境常见的问题就是,有维护人员或者开发同事使用tail命令实时查看日志。然后另外的人使用rm命令删除,...

weixin_34283265的博客 1595

点云工具CloudCompare下载、安装与汉化

打开软件后,是英文界面,找到菜单栏【Display】-【Language Translation】,选择简体中文。进入官网后,点击菜单栏【Download】提示需要重启软件才能生效,点OK即可。重启软件后,已经是中文了。选择合适系统进行下载。常规软件安装流程即可。

sagima_sdu的博客 1万+

Unity 机械臂控制(二)——从碰撞检测到姿态解算:实现精准抓取

本文详细介绍了Unity中机械臂控制的实现方法,从碰撞检测到姿态解算,涵盖精准抓取的全流程。重点讲解了碰撞检测的分层处理、状态机设计、逆向运动学(IK)算法以及抓取稳定性优化等关键技术,并提供了实用的调试技巧和性能优化建议,帮助开发者实现高效的机械臂控制。

weixin_28693447的博客 304

linux 强制删除文件句柄,在linux系统中如果误删除了某个文件,但是文件句柄还被某些进程占用着,这种情况下该怎么恢复被删除的文件呢?...

在linux系统中如果误删除了某个文件,但是文件句柄还被某些进程占用着,这种情况下文件还能恢复吗?如果可以,那该怎么恢复被删除的文件呢?首先我们先来理解下,【文件被删除了,但是文件句柄还被某些进程占用着】是什么意思?先上个图文件名与inode的关系当我们创建一个文件后,linux文件系统会将文件的数据存储到磁盘的数据区(data area),文件根据其大小可能会占用多个磁盘扇区;每个文件都会对应一...

weixin_32818365的博客 968

【AI生成】 LoRa无中心自组网实现方案

LoRa技术是一种低功耗广域网通信技术,它采用了扩频频率调制技术,能够实现远距离的传输。LoRa在物联网中具有重要的应用价值,可以支持大规模的设备连接并且具有较低的成本。同时,LoRa具有高度的抗干扰能力和适应性,能够在复杂的环境中实现稳定的通信。通过使用无中心自组网实现方案,可以进一步提高LoRa网络的灵活性和可靠性,实现设备之间的智能互联。LoRa无中心自组网实现方案将为物联网应用提供更加便捷和高效的通信解决方案。LoRa无中心自组网实现方案一、无中心自组网概念及优势。

qq_31310977的博客 2089

linux 强制删除文件句柄,Linux 文件删除后未释放空间解决办法

现象文件删除后,磁盘空间未释放。排查使用lsof命令查看哪些文件已经被删除,而系统扔持有该文件的句柄未释放(其他进程中正在使用该文件)。lsof | grep deleted输出java 89018 root 125w REG 0,22 /logs/log-info.log (deleted)查看进程为89018...

weixin_34585343的博客 3031

风光互补制氢系统动态仿真建模与性能分析

摘要 本文针对离网型风光互补制氢系统,建立了包含光伏阵列、风力发电机、PEM电解槽、储能电池和储氢罐的完整动态数学模型。基于MATLAB/Simulink平台开发了模块化仿真框架,设计了考虑电解槽最小运行功率约束的能量管理策略。通过典型日仿真分析表明,风光互补可有效平抑单一能源的功率波动,系统整体能量效率达58.7%,电解槽负荷跟随特性良好。提出的动态仿真方法为风光制氢系统的优化设计和运行控制提供了有效工具。 关键词:风光互补制氢;PEM电解槽;动态仿真;MATLAB/Simulink;能量管理

huanghm88的专栏 76

手把手教你学simulink(8.3)--实例:基于 Simulink 的自动驾驶汽车速度控制系统设计与仿真

基于 Simulink 的自动驾驶汽车速度控制系统设计与仿真。

MHD0815的博客 1208

java 文件句柄_Java文件句柄释放

Java代码书写过程,文件资源的释放需要特别谨慎的对待.通常文件资源使用后必须close,然后再删除。如果先删除但没有close掉,会造成文件句柄未被释放.这会造成实际使用磁盘空间较大,成为瓶颈import java.io.File;import java.io.FileOutputStream;import java.io.IOException;public class FileTest {p...

weixin_28904055的博客 1394

【DRAM存储器一】基本存储单元、阵列结构、读写原理

详述DRAM存储器存储单元、存储阵列结构和读写原理

highman110的博客 7255

linux解决文件已删除空间不释放的问题及原因分析

在将数据对应的指针从meta-data中清除后,文件数据部分占用的空间就可以被覆盖并写入新的内容,之所以在出现删除access_log文件后,空间还没释放,就是因为httpd进程还在一直向这个文件写入内容,导致虽然删除了access_log文件,但是由于进程锁定,文件对应的指针部分并未从meta-data中清除,而由于指针并未删除,系统内核就认为文件并未删除,因此通过df命令查询空间并未释放也就不足为奇了。如果空间已被之前的删除文件占满,方式1无法解决,只能回忆可能是哪个进程占用了那个文件,手动kill。

零久的博客 1896

手把手教你学Simulink实例--使用 Simulink 进行电力电子系统的小信号模型仿真

电力电子系统(Power Electronics System)包括各种功率转换器(如 DC-DC 转换器、逆变器等)。这些设备中的关键组件(如 MOSFET、IGBT、电容器、电感器等)不仅影响系统的性能,还直接关系到系统的稳定性、效率和可靠性。因此,在设计阶段进行详细的建模和仿真至关重要。小信号模型仿真的目的是通过线性化非线性系统来评估其动态特性,包括增益、相位裕度、带宽等指标。通过本教程,我们介绍了如何使用 Simulink 进行电力电子系统的小信号模型仿真。背景介绍。

MHD0815的博客 298

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

linux文件已经删除但是空间不释放原因分析

在 Linux 中,如果你删除了文件但是空间没有释放,可能是因为有进程仍然在使用这个文件,导致文件被删除但仍然被进程占用。:如果一个文件有多个硬链接,并且其中一个硬链接被删除了,但是其他硬链接仍然存在,那么删除的硬链接只是从文件系统中删除了索引,但是真正的文件数据仍然存在,直到所有的硬链接都被删除才会释放空间。:有时候,一个文件被删除但是仍然被一个进程打开,导致文件被隐藏起来,直到该进程关闭文件描述符后才能被完全删除。这些命令可以帮助你找出哪些文件已经被删除但仍然被进程占用,并查看它们占用的空间。

完颜振江 5061

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

linux系统删除空间后系统分区空间仍不释放问题

总结的原因: 1、删除文件文件后没有清空回收站; 2、删除的文件不在系统分区,在其他分区上; 3、删除的文件被保留在了/tmp分区下,而/tmp分区不是独立的分区,是在根分区/的基础上划分出来的分区; 4、删除文件的进程delete一直在后台运行,仍然无法对该文件进行读写 常用指令总结: du -h --max-depth=1   查看目录深度为1的目录或文件所占空间大小 lsof |grep deleted      获得一个已经被删除但是仍然被应用程序占用的文件列表 df ...

Eliot_shao的专栏 880

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Linux / Unix 下文件删除、句柄 与空间释放问题

昨天在一个客户环境,由于空间紧张,删除了一个文件,遇到了文件句柄与空间释放的问题,记录一下。在系统上,临时表空间扩展到了32G,我新建了一个临时表空间,并切换了数据库设置:[oracle@corde tdb]$ ls -sorttotal 35101212   51264 -rw-r-----  1 oracle    52429312 Oct 20 08:58 redo02.lo

zhengsj的专栏 2101

lsof处理文件恢复、句柄以及空间释放问题

lsof处理文件恢复、句柄以及空间释放问题

王二的专栏 1万+

linux 强制删除文件句柄,Linux / Unix 下文件删除、句柄 与空间释放问题

昨天在一个客户环境,由于空间紧张,删除了一个文件,遇到了文件句柄与空间释放的问题,记录一下。在系统上,临时表空间扩展到了32G,我新建了一个临时表空间 ,并切换了数据库设置:[oracle@corde tdb]$ ls -sorttotal 3510121251264 -rw-r----- 1 oracle 52429312 Oct 20 08:58 redo02.log51264 -rw...

weixin_39611043的博客 802

linux 删除 文件 句柄,Linux / Unix 下文件删除、句柄 与空间释放问题

昨天在一个客户环境,由于空间紧张,删除了一个文件,遇到了文件句柄与空间释放的问题,记录一下。在系统上,临时表空间扩展到了32G,我新建了一个临时表空间,并切换了数据库设置:[oracle@corde tdb]$ ls -sorttotal 3510121251264 -rw-r----- 1 oracle 52429312 Oct 20 08:58 redo02.log51264 -rw-...

weixin_29679557的博客 978

解决进程文件句柄泄露导致磁盘空间无法释放问题

解决进程文件句柄泄露导致磁盘空间无法释放问题 问题的产生 今天突然接到一台服务器磁盘空间使用率达到90%的报警,于是登陆机器查看磁盘使用情况,发现确实外挂到/data的一块磁盘使用率达到了90%: [root@awsuw7-46 data]# df -h Filesystem Size Used Avail Use% Mounted on /dev/xvda2 ...

qhh0205 1万+

linux删除文件空间不释放问题解决

linux删除文件空间不释放问题解决场景描述日志清理后,查看磁盘空间原因解决方法在线清空文件 场景描述 某天,收到Prometheus报警,生产中某台机器出现磁盘空间不足报警,该台服务器是mysql其中一台从库,远程登录到该服务后,排查磁盘空间的原因,发现mysql日志文件过多,于是清空日志文件,但是日志清理后,发现磁盘空间并没有释放,下面分析处理过程和原因 日志清理后,查看磁盘空间 [root@hhjy3-21 ~]# df -Th Filesystem Type Size Used

leenhem的博客 3676

linux清理oracle磁盘空间,Linux / Unix 下文件删除、句柄 与空间释放问题

Linux / Unix 下文件删除、句柄 与空间释放问题临时表空间,并切换了数据库设置:[oracle@corde tdb]$ ls -sorttotal 3510121251264 -rw-r----- 1 oracle 52429312 Oct 20 08:58 redo02.log51264 -rw-r----- 1 oracle 52429312 Oct 20 10:24...

weixin_35853499的博客 639
上一篇: Linux源码编译/离线安装Nginx
下一篇: Kubernetes--容器集群管理系统快速入门与案例
不以物喜2020
博客等级 码龄8年 85粉丝 100原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值