在我的生活当中遇到磁盘快满了,这时候准备去删除一些大文件

于是我使用ncdu 查看了一下当前系统占用资源比较多的是那些文件,结果一看是elasticsearch的日志文件,好吧,竟然找到源头了,那就把它给删除了吧,

来到相应的路径下之后,然后粗暴一点,执行  rm   -rf   *

很高兴,终于把这些占用系统资源的坏东西给杀死了。满心欢喜的去查看磁盘情况。

给我当头一棒,磁盘并没有多大的变化,之后释放了100多M,但是我明明删除了30G的文件啊,这是怎么回事。

有问题不可怕,干净找baidu/google,找到原因了,说是虽然删除了,但是没有释放资源。

从网上找了一些资料:

执行   lsof | grep deleted我发现有大量刚刚删除文件的进程存在,果断给他kill 掉。但是可能会造成一些影响,比如说一下正在写的文件,之前那样删除的方法就是不对的。

下面是我从网上找的一下资料:

转载于:http://ixdba.blog.51cto.com/2895551/1435781

 

1、错误现象

运维的监控系统发来通知,报告一台服务器空间满了,登陆服务器查看,根分区确实没有空间了,如下图所示:

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

1
2
3
4
[root@localhost~ ]# du -s /tmp/*|sort -nr|head -3
69206016 /tmp/access_log
36 /tmp/hsperfdata_root
36 /tmp/hsperfdata_mapred

通过命令输出发现在/tmp目录下有个66G大小的文件access_log,这个文件应该是apache产生的访问日志文件,从日志大小来看,应该是很久没有清理apache日志文件了,基本判定是这个文件导致的根空间爆满,在确认此文件可以删除后,执行如下删除操作:

[root@localhost ~]#  rm  /tmp/access_log

接着查看系统根分区空间是否释放,如下图所示:

从输出可以看到,根分区空间仍然没有释放,这是怎么回事?

2、解决思路

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

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

3、问题排查

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

从 输出结果可以看到,/tmp/acess.log文件被进程httpd锁定,而httpd进程还一直向这个文件写入日志数据,从第七列可知,这个日志文件 大小仅70G,而系统根分区总大小才100G,由此可知,这个文件就是导致系统根分区空间耗尽的罪魁祸首,在最后一列的“deleted”状态,说明这个 日志文件已经被删除,但由于进程还在一直向此文件写入数据,空间并未释放。

4、解决问题

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

[root@localhost ~]# echo " " >/tmp/acess.log

通过这种方法,磁盘空间不但可以马上释放,也可保障进程继续向文件写入日志,这种方法经常用于在线清理Apache、Tomcat、Nginx等Web服务产生的日志文件。

Linux大文件已删除,但df查看已使用的空间并未减少解决的更多相关文章

  1. 深入理解linux关闭文件和删除文件

    背景介绍 最近看了linux系统编程(linux system programming)一书,结合深入理解linux内核(understanding the linux kernel)一书,深入理解了 ...

  2. Linux大文件分割splite

    /********************************************************************** * Linux大文件分割splite * 说明: * 编 ...

  3. Linux下文件搜索、查找、查看命令

    Linux下文件搜索.查找.查看命令 1.最强大的搜索命令:find 查找各种文件的命令 2.在文件资料中查找文件:locate 3.搜索命令所在的目录及别名信息:which 4.搜索命令所在的目录及 ...

  4. Linux大文件已删除,使用df查看已使用的空间并未减少

    今天在一台Linux系统里,使用df命令查看磁盘使用情况,发现/根分区使用了100% 然后删除一大文件/var/lib/pgsql/9.1/pgstartup.log,再使用df查看使用情况,显示内容 ...

  5. Linux大文件分割split和合并cat使用方法

    本文主要介绍linux下两个命令:split和cat.其中,相信大家都熟悉cat命令,一般用来查看一个文件的内容,但是它还其它的功能,比如这里要介绍的文件合并功能,它可把多个文件内容合并到一个文件中. ...

  6. git push报错大文件,删除后重新commit依然报错

    git push报错: github不能上传大文件,按道理删掉重新提交就行了 可是删掉后,git add -A,再git commit,再git push,依然报错 后来我想明白了 github上传时 ...

  7. 实战|Linux大文件切割

    一个执着于技术的公众号 日常工作中需要对日志文件进行分析,当日志文件过大时,Linux中使用vim.cat.grep.awk等这些工具对大文件日志进行分析将会成为梦魇,具体表现在: 执行速度缓慢,文件 ...

  8. linux大文件读取

    在生产环境中有时候可能会遇到大文件的读取问题,但是大文件读取如果按照一般的手法.如cat这种都是对io的一个挑战,如果io扛得住还好,如果扛不住 造成的后果,如服务器内存奔溃,日志损坏 方法一: se ...

  9. linux 保留文件 其余删除

    set选项与shopt选项是两组不同的内容,用set -o和shopt -p可以分别查看两个组所有的打开和关闭的条目, 在默认状态下,有些是打开的,有些是关闭的,shopt各选项随着bash版本的更新 ...

随机推荐

  1. UESTC 424 AreYouBusy --混合背包

    混合三种背包问题. 定义:dp[i][k]表示体积为k的时候,在前i堆里拿到的最大价值. 第一类,至少选一项,dp初值全赋为负无穷,这样才能保证不会出现都不选的情况.dp[i][k] = max(dp ...

  2. 集合框架学习笔记<三>

    一些重要的区别 set与list的区别: set是无索引的,list是有索引的: ArrayList与LinkList的区别: 前者是基于数组实现的,后者是基于链表实现的: 两者的使用方法一样,但是在 ...

  3. Unity CombineChildren和MeshCombineUtility

    原理 Unity3D如何通过CombineChildren和MeshCombineUtility优化场景? 首先解释下联结的原理和意思:文档里说,显卡对于一个含100个面片的物体的和含1500个面片的 ...

  4. Fidder--实现手机的抓包

    今天闲着没吊事,来写一篇关于怎么抓取Android中的app数据包?工欲行其事,必先利其器,上网google了一下,发现了一款神器:Fiddler,这个貌似是所有软件开发者必备神器呀!这款工具不仅可以 ...

  5. HASHKILL

    6ac66ed89ef9654cf25eb88c21f4ecd0是flag的MD5码,(格式为ctf{XXX_XXXXXXXXXXX_XXXXX})由一个0-1000的数字,下划线,纽约的一个区,下划 ...

  6. GitHub上史上最全的Android开源项目分类汇总

    今天在看博客的时候,无意中发现了 @Trinea 在GitHub上的一个项目 Android开源项目分类汇总 ,由于类容太多了,我没有一个个完整地看完,但是里面介绍的开源项目都非常有参考价值,包括很炫 ...

  7. [资料]常用Windows CMD指令

    1. 查找80端口开放情况 netstat -aon|findstr “80″ 2. 用netstat查询端口占用程序的PID,显示列表的最后一列就是占用程序的PID,然后再利用tasklist找到这 ...

  8. 在matlab中进行遥感影像地理坐标的相互转换

    在matlab中进行图像处理,一般使用的都是图像本地坐标,以左上角(1,1)开始.处理完成后,如果要将结果在带地理坐标的遥感影像中显示,或者需要输出成shp文件,就需要涉及到本地坐标和地理坐标的转换, ...

  9. Navicat创建和设计MySQL事件

    1.开启定时器 0:off 1:on SET GLOBAL event_scheduler = 1; 2.在navicat左侧选择一个数据库,单击“时间”-“创建事件”,弹出一个窗口.

  10. Fedora 12 环境搭建

    又来折腾发行版了. 这一回是Fedora12,搞的挺艰难的 下载了Fedora-12-i386-DVD.iso,无论使用ultraiso还是dd都无法安装. 后来下载了一个ImageWriter.ex ...