背景
最近在服务器上部署了一套服务,服务运行过程中不小心把日志文件给删除了,测试了一下没有影响服务的正常运行,而且没有日志后处理的操作就不以为意的扔那了,但不经意间也埋下了一个巨大的坑。收到服务器磁盘报警的时候就df看了一下满了,但是du -h看的时候发现才总共130G的磁盘采用了20G不到。
问题
df -h :磁盘空间是满的
du -h :磁盘占用才20G不到
产生原因(百度的)
du -h
du -sh命令通过将指定文件系统路径下所有的目录、符号链接、文件使用的块数累加起来得到总块数以及总大小。它会遍历这个目录,针对所有真实存在的文件、目录等汇总,给出最终结果
df -h
首先,获取这个文件的文件句柄,这是会判断这个文件是否存在!
然后,程序所有的写入操作仅仅使用文件句柄,而不再关注具体文件是否存在!Linux中允许对一个正在写入的文件进行删除RM或者移动MV。应用程序获取句柄,就直接指向到了磁盘位置,到了数据块的级别上进行写入了,不再检查数据块所属的文件是否存在。这时候的写入,对于其他人,由于访问的入口–文件–不存在了,所以是看不到其写入的内容的!
解决方案
lsof -n | grep deleted
找到打开的但被删除的文件,然后找到使用这个文件的服务重新启动就可以了。这个时候再用df -h 去查看磁盘空间已经正常了。