日常运维过程中,我们经常需要处理磁盘空间问题,当接到告警后,第一时间会去找那些大文件,一般比如 Centos,可能大文件就是 /var/log/messages
。
但有的时候,会出现怎么也查不到大文件的情况,通过 du
查找的时候,统计出来的大小,跟 df
显示的占用空间对应不上。
如果通过 df -i
查看inode没有满的话,那么极有可能,是有大文件被直接rm了,但是仍然有进程打开了这个文件。
这种情况,由于进程没有退出,因此文件占用的空间并不会释放;直到进程退出,磁盘空间才会真正释放。
如何找到是哪个进程打开了该文件
在 Linux 上,由于进程仍然存活,因此可以通过查看所有进程打开的 fd,如果该文件已经被删除,则查看时,会显示(deleted)
。
示例如下:
1 | $ sudo find /proc/*/fd -ls | grep '(deleted)' |
如何避免这种情况
不要直接删除该文件,而是通过将文件 truncate 的方式,释放磁盘空间。
一种方式是:
1 | cat /dev/null > ${filename} |
或者(新get!)
1 | : > ${filename} |
如此,可以快速释放空间。
参考文档
本文转载自:「Zlatan Eevee」,原文:https://tinyurl.com/y89mq5oq,版权归原作者所有。欢迎投稿,投稿邮箱: editor@hi-linux.com。