##磁盘空间满 因为Linux没有回收站功能,因此线上服务器上全部要删除的文件都会先移动到系统/tmp目录下,而后按期清除/tmp目录下的数据。这个策略自己没有问题,可是经过检查发现这台服务器的系统分区中并无单独划分/tmp分区,这样/tmp下的数据其实占用了根分区的空间。既然找到了问题,那么删除/tmp目录下一些占空间较大的数据文件便可,检查/tmp下最大的三个数据文。服务器
du -sh /tmp/* | sort -nr | head -3
查看/tmp下最大的前三个数据文件 经过命令输出发如今/tmp目录下有个66GB大小的文件access_log,这个文件应该是Apache产生的访问日志文件,从日志大小来看,应该是好久没有清理Apache日志文件了,基本断定是这个文件致使的根空间爆满,在确认此文件能够删除后,执行以下删除操做:操作系统
rm /tmp/access_log
接着查看系统根分区空间是否释放,从输出能够看到,根分区空间仍然没有释放,这是怎么回事? ##删除文件空间不释放 通常来讲不会出现删除文件后空间不释放的状况,可是也存在例外,好比文件被进程锁定,或者有进程一直在向这个文件写数据等,要理解这个问题,就须要知道Linux下文件的存储机制和存储结构。 ##文件的数据与指针部分 一个文件在文件系统中的存放分为两个部分:数据部分和指针部分,指针位于文件系统的meta-data中,在将数据删除后,这个指针就从meta-data中清除了,而数据部分存储在磁盘中。在将数据对应的指针从meta-data中清除后,文件数据部分占用的空间就能够被覆盖并写入新的内容,之因此在出现删除access_log文件后,空间还没释放,就是由于httpd进程还在一直向这个文件写入内容,致使虽然删除了access_log文件,可是因为进程锁定,文件对应的指针部分并未从meta-data中清除,而因为指针并未删除,系统内核就认为文件并未删除。 ##查找被应用程序占用的已删除文件列表 所以经过df命令查询空间并未释放也就既然有了解决问题的思路,那么接下来看看是否有进程一直在向access_log文件中写数据,这里须要用到Linux下的lsof命令,经过这个命令能够获取一个仍然被应用程序占用的已删除文件列表:指针
lsof | grep delete
从输出结果能够看到,/tmp/access_log文件被进程httpd锁定,而httpd进程还一直向这个文件写入日志数据。从第7列可知,这个日志文件大小约70GB,而系统根分区总大小才100GB,由此可知,这个文件就是致使系统根分区空间耗尽的罪魁祸首。最后一列的“deleted”状态说明这个日志文件已经被删除,但因为进程还在一直向此文件写入数据,所以空间并未释放。 ##正确地清空文件 解决这一类问题的方法有不少种,最简单的方法是关闭或重启httpd进程,固然也能够重启操做系统,不过这些并非最好的方法。对待这种进程不停对文件写日志的操做,要释放文件占用的磁盘空间,最好的方法是在线清空这个文件,具体能够经过以下命令完成:日志
[root@localhost ~]# echo " " >/tmp/access_log
经过这种方法,磁盘空间不但能够立刻释放,也可保障进程继续向文件写入日志,这种方法常常用于在线清理Apache、Tomcat、Nginx等Web服务产生的日志文件。code