伟明部落格

Linux下解决删除了文件但磁盘空闲空间没增长的问题

--发布于 2024-04-10 12:19:22

有时,我们在Linux平台下,明明删除了一些文件(比如非常大的日志文件,程序的输出文件等),但是磁盘的空闲空间还是这么小。出现这种情况,大概率是因为还有运行的进程在持有这个已被删除的文件的句柄。这样,这个文件虽然在文件系统的目录中是不可见的,但它在磁盘分区的超级块中还是存在的,也就是说没有被真正的删除。有些磁盘统计分析工具,比如df命令,还是会将这个文件统计进去的。这样我看到的结果就是,磁盘空间还没被释放!

如何找出这些未被真正删除的文件

我们可以使用lsof命令来查询这种文件,这种文件被系统标记为deleted状态(也就是被删除的状态)。如果系统中有大量deleted状态的文件,就会造成df工具统计的信息与我们的认知不一致。

lsof | grep deleted > output.txt

在output.txt文件中,就会输出类似于这种信息

simpletun 15704          root    1w      REG              253,1 13202533434    1054815 /root/simpletun-crypt/nohup.out (deleted)
simpletun 15704          root    2w      REG              253,1 13202533434    1054815 /root/simpletun-crypt/nohup.out (deleted)

如上所示,/root/simpletun-crypt/nohup.out这个文件就是删除了,但没被真正释放掉。其中,13202533434就是占用的空间大小(字节)。第二列那个15704就是持有那个文件句柄的进程ID。

如何真正释放这些空间

因为造成这种原因的现象是,持有这个文件句柄的进程还在进行。我们就只能重启对应的进程,如上述例子中进程ID为15704的进程

kill 15704

关掉这个进程后,对应文件的磁盘空间就会释放出来。

更好的解决方案

既然是因为正在运行的进程最好不要删除它打开的输出文件,不然有可能会造成磁盘空间不能真正释放的问题。那我们就将那个文件(以my_file为例)写为空就可以了,命令

cat /dev/null > my_file

或更简短的

>my_file

这样就可以清空对应的文件了。

--更新于 2024-04-10 12:23:31