文件删除后磁盘空间不释放
du 和 df 的工作原理
- du的工作原理
du命令会对待统计文件逐个调用fstat这个系统调用,获取文件大小。它的数据是基于文件获取的,所以有很大的灵活性,可以针对多个分区,跨越多个分区操作。
注意:如果针对的目录文件很多,du的速度就会很慢了。 - df的工作原理
df命令使用的是statfs这个系统调用,直接读取分区的超级块信息获取分区使用情况。它的数据是基于分区元数据的,所以只能针对整个分区,不能对多分区操作。
注意:由于df直接读取超级块,所以运行速度不受文件多少的影响。
du和df不一致的情况
- 问题描述:
常见的df和du不一致的情况就是文件删除的问题。当一个文件被删除后,在文件系统目录中已经没有了,所以du命令 时就不再统计它了。然而如果此时还有运行的进程持有这个已经被删除了的文件的句柄,那么这个文件实际上不会真正的从磁盘中被删除,分区超级块中的信息也就不会被更改。这样使用df命令仍然会统计这个被删除了的文件。
解决方法
-
当出现du和df差距很大的情况时,考虑是否是有删除文件未完成造成的
方法:使用# lsof -n |grep deleted
命令查看
在最后一列的“deleted”状态,说明这个 日志文件已经被删除,但由于进程还在一直向此文件写入数据,空间并未释放。 -
可以使用清空文件的方式来代替删除文件
方法:可以使用# echo '' > myfile.log
-
对于经常发生删除问题的日志文件
方法:以改名、清空、删除的顺序操作 -
除了rm -rf 命令外,有些命令会间接的删除文件
如gzip压缩命令完成后会删除原来的文件,为了避免删除问题,压缩前先确认没有进程打开该文件gzip常用命令
命令 | 说明 |
---|---|
gzip 文件 | 压缩 |
gzip -dv 压缩文件 | 解压并打印执行过程 |
gzip -c 待压缩文件 > 带压缩文件.gz | 压缩文件并保留源文件 |
gzip * | 批量压缩 |
gzip -dv * | 批量解压 |
lsof命令扩展
lsof(list open files)是一个列出当前系统打开文件的工具。
查看已经删除的文件,空间有没有释放,没有的话kill掉pid
命令:lsof -n |grep deleted
找到已删除但未释放磁盘空间的文件,查看PID
# ps aux|grep PID
查看该进程是否是服务的主进程以及是否可以关闭
如果该进程可以关闭或者重启,则执行kill -9 PID
释放该磁盘空间
联系作者