磁盘是Linux系统中一项非常重要的资源,对Linux磁盘管理有经验的同学们应该都知道df和du这两个命令的用途;
df:检查文件系统占用磁盘情况;
du:检查目录占用磁盘情况;
正常情况下两条命令看到的磁盘占用情况应该一致,什么情况下会出现结果不一致的情况呢?下面给大家分享在项目中遇到的问题;
设备分区满了,什么情况?赶紧看看什么原因:
先看看目录大小:
再看看文件大小,原来是log文件:
删除文件:
这下恢复了吧?
what?使用df查看/run/user/1000分区的使用率还是100%:
可使用du查看文件夹的大小明明只有28K啊:
这就要从df和du的区别说起了。
df:
disk free的缩写,使用statfs系统调用,直接读取分区的超级块信息获取分区使用情况。它的数据是基于分区元数据的,所以只能针对整个分区。由于df直接读取超级块,所以运行速度不受文件多少影响。
du:
disk usage的缩写,du命令会对统计文件逐个调用fstat系统调用,获取文件大小。它的数据是基于文件获取的,所以有很大的灵活性,不一定非要针对一个分区,可以跨越多个分区操作。如果统计的目录中文件很多,du速度就会变慢。
当一个文件被删除后,在文件系统目录中已经不见了,所以du不会再统计。然而如果此时还有运行的进程持有这个已经被删除的文件的句柄,这个文件就不会真正在磁盘中删除, 分区超级块中的信息也不会更改。这样df仍旧会统计这个被删除的文件。
怎么办?
lsof查看被删除的文件被打开的情况:
确认进程:
杀掉进程:
df查看分区空间正常:
以上设备截图为举例,在实际的项目开发过程中,有很多日志需要处理,如系统引擎日志、nginx日志、各类开源软件日志等。对日志的大小都需要进行管理。在删除旧日志时,很可能就会遇到这个问题。
问题解决方法:
- lsof查看使用文件的进程,结束进程。
- 或使用清空的方式代替rm,如echo > /tmp/test.log
参考资料:
https://www.cnblogs.com/heyonggang/p/3644736.html