日常运维过程中,咱们常常须要解决磁盘空间问题,当接到告警后,第一工夫会去找那些大文件,个别比方 Centos,可能大文件就是 /var/log/messages
。
但有的时候,会呈现怎么也查不到大文件的状况,通过 du
查找的时候,统计进去的大小,跟 df
显示的占用空间对应不上。
如果通过 df -i
查看 inode 没有满的话,那么极有可能,是有大文件被间接 rm 了,然而依然有过程关上了这个文件。
这种状况,因为过程没有退出,因而文件占用的空间并不会开释;直到过程退出,磁盘空间才会真正开释。
如何找到是哪个过程关上了该文件
Linux 上,因为过程依然存活,因而能够通过查看所有过程关上的 fd,如果该文件曾经被删除,则查看时,会显示 (deleted)
。
示例如下:
$ sudo find /proc/*/fd -ls | grep '(deleted)'
388609 0 lrwx------ 1 zerotier-one zerotier-one 64 Aug 21 00:19 /proc/29400/fd/4 -> /tmp/ibpX85Vd\ (deleted)
388610 0 lrwx------ 1 zerotier-one zerotier-one 64 Aug 21 00:19 /proc/29400/fd/5 -> /tmp/ibCwAgAj\ (deleted)
388611 0 lrwx------ 1 zerotier-one zerotier-one 64 Aug 21 00:19 /proc/29400/fd/6 -> /tmp/ibRZ5rep\ (deleted)
388612 0 lrwx------ 1 zerotier-one zerotier-one 64 Aug 21 00:19 /proc/29400/fd/7 -> /tmp/ibBuNEzA\ (deleted)
388616 0 lrwx------ 1 zerotier-one zerotier-one 64 Aug 21 00:19 /proc/29400/fd/11 -> /tmp/ibG68kpG\ (deleted)
如何防止这种状况
不要间接删除该文件,而是通过将文件 truncate 的形式,开释磁盘空间。
一种形式是:
cat /dev/null > ${filename}
或者(新 get!)
: > ${filename}
如此,能够疾速开释空间。
参考文档:Find and remove large files that are open but have been deleted
本文转自:「Zlatan Eevee」
原文:https://tinyurl.com/y89mq5oq
近期热文举荐:
1.600+ 道 Java 面试题及答案整顿 (2021 最新版)
2. 终于靠开源我的项目弄到 IntelliJ IDEA 激活码了,真香!
3. 阿里 Mock 工具正式开源,干掉市面上所有 Mock 工具!
4.Spring Cloud 2020.0.0 正式公布,全新颠覆性版本!
5.《Java 开发手册(嵩山版)》最新公布,速速下载!
感觉不错,别忘了顺手点赞 + 转发哦!