502 字
3 分钟
Linux 下 rm 删除文件后,磁盘容量没有被释放
问题描述
使用 rm -f 指令删除文件后,再使用 df -h 指令查看,发现磁盘空间可能未被释放
问题原因
在 Linux 系统中,通过 rm 删除文件将会从文件系统的目录结构上解除链接,但此时如果文件是正在被使用,比如 java 服务正在运行此时删除其日志,进程其实仍然可以读取该文件,只是在文件列表上看不见了,磁盘空间也一直被占用,除非把占用此文件的服务关闭,文件才会正式被删除
解决方案
方法一 (会将关联程序杀掉,需要将被杀的程序进行重启)
当 Linux 打开一个文件的时候,Linux 内核会为每一个进程在 /proc/xxx/fd/ 目录(xxx 为进程的 pid 号),建立一个以其 pid 为名的目录用来保存进程的相关信息,而其子目录 fd 保存的是该进程打开的所有文件
第一个方法就是直接 kill 关联文件的进程
查看所有正在使用已经被删除的文件的进程(推荐使用第一种方法,第二种方法没用的数据太多)
sudo find /proc/xxx/fd -ls | grep '(deleted)' # 方法一sudo lsof | grep deleted # 方法二Kill 相应的进程或者重启该进程,让 OS 自动回收磁盘空间
sudo kill -9 xxx方法二 (程序很重要,不能被停止/杀死进程)
通过该进程,进入到对应的 /proc/xxx/fd 目录,仍然可以找到对应的被删除文件(找到后缀是 delete 标签的文件)
OS 会使用一个 fd 来链接文件的物理位置
直接向目标文件写入一个空格字符串来替换目标文件的内容,以达到清理目标文件占用的目的(推荐第一种方法)
sudo echo " " > "/proc/$pid/fd/$fd" # 方法一sudo echo " " > 文件名 # 方法二 Linux 下 rm 删除文件后,磁盘容量没有被释放
https://dyh1319.asia/posts/linux-rm-not-free-disk/