磁盘空间已满由于linux没有回收站功能,在线服务器上所有要删除的文件都会先移动到系统/tmp目录下,再移动/tmp下的数据目录会定期清空。这个策略本身没有问题,但是通过检查发现这个服务器的system分区并没有单独的/tmp分区,所以/tmp下的数据实际上占用了root分区的空间。既然问题找到了,就把/tmp目录下一些占用空间大的数据文件删掉,查看/tmp下最大的三个数据文件。杜-sh/tmp/*|排序-nr|head-3查看/tmp下前三个最大的数据文件通过命令输出发现/tmp目录下有一个66GB的文件access_log。这个文件应该是Apache生成的访问日志文件,从日志的大小来看,应该是Apache日志文件很久没有清理了。基本判断是这个文件导致的根空间满了。确认文件可以删除后,执行如下删除操作:rm/tmp/access_log然后查看系统根分区空间是否释放。从输出结果可以看出,根分区的空间仍然没有释放。这是怎么回事?删除文件不释放空间一般不会导致删除文件后空间不释放,但也有例外,比如文件被进程锁定,或者进程一直在向该文件写入数据等。要弄明白这个问题,就需要知道Linux下文件的存储机制和存储结构。文件的数据和指针部分文件在文件系统中的存储分为两部分:数据部分和指针部分。该指针位于文件系统的元数据中。数据删除后,指针从元数据中清除,同时数据部分存储在磁盘上。从元数据中清除数据对应的指针后,可以覆盖文件数据占用的空间,写入新的内容。删除access_log文件后空间还没有释放的原因是因为httpd进程还在往这个文件里写内容,所以虽然删除了access_log文件,但是由于进程锁,文件对应的指针部分还没有从meta-data中清除,也因为指针还没有被删除删除,系统内核认为文件没有被删除。.找到应用程序占用的已删除文件列表。所以通过df命令查询的空间并没有释放。既然有了解决问题的思路,那么再看看是否有进程一直在向access_log文件写入数据。这里需要用到Linux下的lsof命令,通过该命令可以得到已删除但仍被应用程序占用的文件列表:lsof|grepdelete从输出中可以看到/tmp/access_log文件被httpd进程锁定,httpd进程一直往这个文件写入日志数据。从第七列可以看出,这个日志文件的大小约为70GB,而系统根分区的总大小只有100GB。由此我们可以看出,这个文件是导致系统根分区空间不足的罪魁祸首。最后一列的“已删除”状态表示日志文件已经被删除,但是空间还没有释放,因为进程还在向文件写入数据。正确清空文件的方法有很多,可以解决这类问题。最简单的方法是关闭或重启httpd进程。当然,你也可以重启操作系统,但这都不是最好的方法。对付这种不断向文件写入日志的进程,最好的办法就是释放文件占用的磁盘空间,也就是在线清除文件,可以通过以下命令来完成:[root@localhost~]#echo"">/tmp/access_log通过这种方式,不仅可以立即释放磁盘空间,还可以保证进程继续向文件写入日志。该方法常用于在线清理Apache、Tomcat、Nginx等Web服务产生的日志文件。
