
# 文件已经删除，但空间未释放怎么办？
#### 问题现象
Linux操作系统云服务器根目录空间占用率过高。例如，以[图1]为例，根目录空间占用率为96%。
图1根目录空间占用率过高   
![](https://support.huaweicloud.com/trouble-ecs/zh-cn_image_0000001124886602.png "点击放大")
查询当前系统存在一个约42G大小的文件access_log，这个文件是apache产生的访问日志文件，从日志大小判断是很久没有清理的apache日志文件了。
1. 执行以下命令删除access_log。 **rm /tmp/access_log**
   
2. 执行以下命令查看文件系统使用率。 **df -h**
   
删除该文件后使用df查看文件系统使用率仍是96%。
#### 根因分析
通常不会出现删除文件后空间不释放的情况，特殊情况是文件进程锁定，或有进程一直在向这个文件写数据。
为了分析根因，首先需要了解Linux文件的存储机制和存储结构。
一个文件在文件系统中存放分为两个部分：
- 指针部分：指针位于文件系统的meta-data中，在将数据删除后，这个指针就从meta-data中清除了。
- 数据部分：而数据部分存储在磁盘中。
将数据对应的指针从meta-data中清除后，文件数据部分占用的空间就可以被覆盖并写入新的内容。出现删除access_log文件后，空间还没有释放的原因，是因为httpd进程还在一直向这个文件写入内容，导致删除了access_log文件后，进程锁定，文件对应的指针部分并未从meta-data中清除，由于指针并未删除，系统内核就默认文件并未被删除，因此查询文件系统使用率时，显示空间并未释放。
#### 处理方法
1. 使用lsof命令查看是否有进程一直在向access_log文件中写入数据。 **lsof -n \|grep delete**
   图2查看写入进程   
   ![](https://support.huaweicloud.com/trouble-ecs/zh-cn_image_0179964327.png "点击放大")
   如回显信息所示，/tmp/access_log 文件被进程httpd锁定，而httpd进程还一直向这个文件写入日志数据，最后一列的"deleted"状态说明这个日志文件已经被删除，但是由于进程还在一直向此文件写入数据，因此空间并未释放。
   
2. 可以选择关闭或者重启httpd进程，或重启操作系统。推荐在线清空**access_log。**
   执行以下命令清空**access_log**。
   **echo ""\>/access_log**
   通过这种方法，磁盘空间不但可以马上释放，也可以保证进程继续向文件写入日志，再次执行**df -h**查看根分区空间已经释放。
   图3查看根目录空间占用率   
   ![](https://support.huaweicloud.com/trouble-ecs/zh-cn_image_0000001171646533.png "点击放大") 
 
