一般来说不会出现删除文件后空间不释放的情况,但是也存在例外,比如文件被进程锁定,或者有进程一直在向这个文件写数据等,要理解这个问题,就需要知道 下文件的存储机制和存储结构。
1、错误现象
运维的监控系统发来通知,报告一台服务器空间满了,登录服务器查看,根分区确实没有空间了:

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

[root@localhost ~]# du -sh /tmp/*|sort -nr|head -3
通过 输出发现在/tmp目录下有个66GB大小的文件access_log,这个文件应该是Apache产生的访问日志文件,从日志大小来看,应该是很久没有清理Apache日志文件了,基本判定是这个文件导致的根空间爆满,在确认此文件可以删除后,执行如下删除操作:

[root@localhost ~]# rm /tmp/access_log
接着查看系统根分区空间是否释放:

[root@localhost ~]# df -h
从输出可以看到,根分区空间仍然没有释放,这是怎么回事?

2、解决思路
一般来说不会出现删除文件后空间不释放的情况,但是也存在例外,比如文件被进程锁定,或者有进程一直在向这个文件写数据等,要理解这个问题,就需要知道Linux下文件的存储机制和存储结构。

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

3、问题排查
既然有了解决问题的思路,那么接下来看看是否有进程一直在向access_log文件中写数据,这里需要用到Linux下的lsof命令,通过这个命令可以获取一个仍然被应用程序占用的已删除文件列表,命令执行如下:

[root@localhost ~]# lsof | grep delete
从输出结果可以看到,/tmp/access_log文件被进程httpd锁定,而httpd进程还一直向这个文件写入日志数据。从第7列可知,这个日志文件大小约70GB,而系统根分区总大小才100GB,由此可知,这个文件就是导致系统根分区空间耗尽的罪魁祸首。最后一列的“deleted”状态说明这个日志文件已经被删除,但由于进程还在一直向此文件写入数据,因此空间并未释放。

4、解决问题
到这里问题就基本排查清楚了,解决这一类问题的方法有很多种,最简单的方法是关闭或重启httpd进程,当然也可以重启操作系统,不过这些并不是最好的方法。对待这种进程不停对文件写日志的操作,要释放文件占用的磁盘空间,最好的方法是在线清空这个文件,具体可以通过如下命令完成:

[root@localhost ~]# echo " " >/tmp/acess.log
通过这种方法,磁盘空间不但可以马上释放,也可保障进程继续向文件写入日志,这种方法经常用于在线清理Apache、Tomcat、Nginx等Web服务产生的日志文件。

linux中如何解决文件已删除但空间不释放的案例相关推荐

  1. 运维实战案例之文件已删除但空间不释放问题解析

    1.错误现象 运维的监控系统发来通知,报告一台服务器空间满了,登陆服务器查看,根分区确实没有空间了,如下图所示: 这里首先说明一下服务器的一些删除策略,由于Linux没有回收站功能,我们的线上服务器所 ...

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

    1.错误现象 运维的监控系统发来通知,报告一台服务器空间满了,登录服务器查看,根分区确实没有空间了: [root@localhost ~]# df -h 这里首先说明一下服务器的一些删除策略,由于Li ...

  3. linux disk 清除数据,如何在Linux中使用TestDisk恢复已删除的文件

    我们都知道寻找文件而不是找到文件的感觉,即使是在垃圾桶里也是如此. 由于TestDisk ,文件和数据丢失带来的创伤应该结束 - 这是一个免费的开源软件,最初设计用于恢复内存分区并使不可引导的磁盘再次 ...

  4. linux中的echo%3e文件,Linux文件已删除,引用未释放(deleted)

    问题描述: 警告文件磁盘已经满了,通过:df -h, du -sh * 等指令配合使用,发现当前系统任然存在大量可以使用的空间.大量剩余的磁盘空间不清楚怎么丢失了- 问题重现: 通过指令:lsof | ...

  5. Linux文件已删除,引用未释放(deleted)

    问题描述: 警告文件磁盘已经满了,通过:df -h, du -sh * 等指令配合使用,发现当前系统任然存在大量可以使用的空间.大量剩余的磁盘空间不清楚怎么丢失了- 问题重现: 通过指令:lsof | ...

  6. LINUX文件已删除但磁盘空间不释放

    LINUX文件已删除但磁盘空间不释放 转自:http://www.jb51.net/LINUXjishu/224652.html 1.错误现象 运维的监控系统发来通知,报告一台服务器空间满了,登陆服务 ...

  7. Linux中常用头文件的作用--转

    http://blog.sina.com.cn/s/blog_5c93b2ab0100q62k.html 1. Linux中一些头文件的作用: <assert.h>:ANSI C.提供断言 ...

  8. 本机修改虚拟机linux中的代码文件

    最近在研究swoole这个框架,好不容易装了一个swoole,为了开发方面,需要早宿主机和虚拟机之间文件共享,一开始使用vmware tool可以实现共享,但是只能在linux中看到win共享的文件, ...

  9. linux mysql命令行导入_在linux中导入sql文件的方法分享(使用命令行转移mysql数据库)...

    因导出sql文件 在你原来的网站服务商处利用phpmyadmin导出数据库为sql文件,这个步骤大家都会,不赘述. 上传sql文件 前面说过了,我们没有在云主机上安装ftp,怎么上传呢? 打开ftp客 ...

最新文章

  1. vscode 开发lua搭建
  2. ylbtech-LanguageSamples-Generics(泛型)
  3. 微信小程序ios可以上下左右拖动的问题
  4. Material DesignDrawerLayout的旋转箭头的实现方式。
  5. eclipse 配置黑色主题
  6. Python之io概念
  7. sql 树状结构中知道 父节点与孙节点_数据结构之(树)
  8. 有可能导致HttpQueryInfo 执行时出现12150 错误的一个原因
  9. 【jQuery笔记Part3】03-jQuery项目:随机抽奖
  10. 电子商务商品供应链概论
  11. 重新认识fprint,sprint
  12. 大华电子秤客户端开发文档_『飞桨』全流程开发工具PaddleX
  13. 全能电子地图下载器 破解版 亲测可用
  14. 怎么用计算机测出来体脂,keep软件测体脂率的在哪 keep怎么测体脂
  15. 【Linux】返回上级目录
  16. c语言第二版第三章答案,C语言程序设计(第2版) 刘克威,张凌晓著 习题答案-第三章...
  17. 那些有趣/用的Python库
  18. 语言表达的6c原则是指什么,商业计划书的6C原则是什么?
  19. Word文件不能编辑是什么原因?
  20. Windows应急响应 -Windows日志排查,系统日志,Web应用日志,

热门文章

  1. URL Scheme-短信、邮件、微信外网页等场景打开小程序
  2. android蓝牙查看电池容量_Android中获取电池电量
  3. 类中的三个装饰器方法
  4. 20165221 JAVA第四周学习心得
  5. [QA翻译]如何在Storm里拆分stream流?
  6. HDU 4371 Alice and Bob
  7. 《二》Android 数据库 SQlite SQLiteOpenHelper
  8. mysql创建存储过程及遍历查询结果,mysql 用存储过程遍历结果集
  9. 搭建一个简单repo服务器
  10. Android使用valgrind内存泄漏和越界检测等