du和df命令的区别

写在开头

今天分享一个上一个星期看到的一篇文章,文章原稿来源于公号--架构师之路,来看一下这个是什么的一个问题。

在开发的过程中,我们都会碰到突然环境上面不打印日志,这个时候,我们的第一反应就是,是不是环境的磁盘空间满了。故事就此开始了。

命令检查磁盘情况

使用常见命令检查磁盘情况。df和du,回顾一下这两个命令的区别:

du: disk usage

通过搜索文件来计算每个文件的大小然后累加得到的值

df: disk free

通过文件系统来获取空间大小的信息

原文中:通过df -h命令看到的磁盘已经使用了100%,我自己电脑的没有模拟出来这个环境


问题出现了:为啥命令du看到的还有空间  而df看到的空间就满了,而且也确实不打印日志了。

解释du为啥看到还有空间df就看不到

因为df和du的统计机制不一样。


du会把指定目录下所有文件、目录、目录下的文件都统计。是建立在文件系统能看到的的确确是有这样一些文件的基础上的。也就是说我们能在文件系统里面看到的文件才会被du统计。


df(df命令通过查看文件系统磁盘块分配图得出总块数与剩余块数。):

这要从程序写文件的方式来谈起,一个进程要向一个文件里面写东西,那么会得到一个pointer,

然后向指针指向的文件(磁盘区域)写入。假如由于某些原因(也可能人为)被指向的文件被删除了,但是( write call)并不知道文件是否还在,就还会继续向里面写,不管文件是否存在,磁盘块还是被写操作使用。

于是因为文件没有了,所以du统计不到写入的这些磁盘块,但是因为写的进程还在,磁盘空间没有被释放,所以df却能统计到,所以df统计的结果比du大很多。

生产常见的场景

比如你的应用启动,在不停往一个日志文件中写入日志,这个时候,不小心将该日志文件删除了。


du显示的结果会把日志大小减去,而df则仍会包含该日志的大小(实际上仍引用了该文件的句柄)。


如果要删除某个应用正在往里面写内容的日志的文件,不要直接用rm -rf  而是要:

echo "" > 日志名称(比如:echo "" > client.log)

如何找出被程序引用着的已经删除的文件

lsof:list open files

使用lsof查看打开的文件。

lsof | grep deleted

欢迎加入程序员打卡社群 www.51manong.com 

关注微信公众号:





转载于:https://juejin.im/post/5c9a29f1e51d4527c97a5d23

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值