前两天,同事找我看一个问题,发现一台服务器上的磁盘空间快占满了,却找不到占用磁盘的文件。最后定位发现是服务器上有两个进程A和B,进程A写文件,进程B定时删除文件,但是进程B删除文件后,删除的文件实际上还在占用磁盘空间,这是为什么呢?
下面我在服务器上实际操作演示一下这个问题发生的过程。
1 问题复现
1)先使用df命令查看一下磁盘根目录的空间占用情况,当前占用55G:
2)使用dd命令在根目录下创建一个10G的大文件test.bin,并再次查看根目录的空间占用情况,发现根目录空间占用已经从55G变为了65G:
dd if=/dev/zero of=/test.bin bs=1000MB count=10
3)使用tail命令模拟进程A正在使用test.bin文件:
tail -f /test.bin
4)删除test.bin文件(模拟进程B删除文件),并查看磁盘空间占用情况,发现根目录的空间占用还是65G,并没有减少:
rm -rf /test.bin
2 问题定位及解决
2.1 问题定位
其实上面我们是已经知道了有tail命令在访问文件,所以导致删除的文件还在占用磁盘空间。但是如果是因为别的程序或者其它进程导致这个问题,我们该如何定位呢?
这里我们要借助lsof这个工具来帮助我们定位问题,一般Linux系统没有自带lsof工具,Ubuntu上可以用apt安装一下:
apt install lsof
man lsof看一下lsof命令的介绍,是列出所有打开的文件(list open files的缩写)