1.基础环境
系统中偶尔出现磁盘实际占用空间与文件总大小差距很大的情况,比如磁盘实际占用空间100G,但磁盘上文件的总大小60G,这情况是服务调用了已经删除的文件导致,这里涉及文件的删除原理,你可以自行百度了解。
那么这种情况怎么释放磁盘空间呢?
2.实施方法
2.1.重启服务
此时重启服务即可,不过生产环境一般不能随意重启服务。所以请看下一种方法。
2.2.清空文件
清空?文件已经被删除了,如何清空呢?文件在被进程调用的时候,会在/proc/${pid}/fd 下面生成一个软链接文件,只要把这个软链接文件清空即可。
下面进行演示:

1 创建文件

root@Database5:~/test# dd if=/dev/zero of=a.txt count=1000 bs=1M
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB, 1000 MiB) copied, 0.774476 s, 1.4 GB/s

2 查看磁盘大小(本测试机只有一块系统盘)

root@Database5:~/test# df -h| grep -w /
/dev/vda1 20G 6.8G 12G 37% /
窗口1,进程调用文件
root@Database5:~/test# vim a.txt
窗口2,删除文件并查看磁盘空间
root@Database5:~/test# rm -f a.txt
root@Database5:~/test# df -h| grep -w /
/dev/vda1 20G 6.8G 12G 37% /
窗口2已经删除了a.txt文件,但是空间并没有被释放。
root@Database5:~/test# lsof | grep [a].txt | grep deleted
vim 3825 root 3r REG 253,1 1048576000 671219 /root/test/a.txt (deleted)
接下来进入/proc/被服务调用的文件如何彻底删除 - 图1{pid} 是进程的pid,这里是3825
root@Database5:/proc/3825/fd# ll
total 0
dr-x——— 2 root root 0 Feb 25 16:40 ./
dr-xr-xr-x 9 root root 0 Feb 25 16:40 ../
lrwx——— 1 root root 64 Feb 25 16:40 0 -> /dev/pts/0
lrwx——— 1 root root 64 Feb 25 16:40 1 -> /dev/pts/0
lrwx——— 1 root root 64 Feb 25 16:40 2 -> /dev/pts/0
lr-x——— 1 root root 64 Feb 25 16:40 3 -> /root/test/a.txt (deleted)
lrwx——— 1 root root 64 Feb 25 16:40 4 -> /root/test/.a.txt.swp
这里只要情况软链接3即可,接下来我们看一下:
root@Database5:/proc/3825/fd# > 3
root@Database5:/proc/3825/fd# df -h| grep -w /
/dev/vda1 20G 5.8G 13G 31% /
这里可以看到磁盘空间被释放了。
其实这里也可以用来恢复被误删的文件。
3.删除文件前先清空
无论文件是否被调用,先清空在删除,那么删除的文件就不会占用磁盘空间了。