为什么会出现rm文件后不释放磁盘空间呢?
在日常的线上当中,不可避免的遇到一种情况:磁盘空间几乎耗尽,但使用du命令查看磁盘占用情况时,却似乎没有发现占用大量空间的文件。这种情况下,通常是因为删除某个文件后,磁盘空间并未真正释放所致。
然而在Linux 操作系统中,文件可以分为两部分:数据部分和指针部分(inode)。指针部分位于文件系统的元数据(meta-data)中,而实际的文件数据存储在磁盘上。当你执行删除操作(例如使用 rm 命令)时,文件的指针从元数据中删除,但是文件的数据部分并没有立即被删除,它的存储空间会被标记为可用以供后续写入新的内容。这意味着删除文件并不会立即释放磁盘空间,而是将文件标记为可覆盖。
进程与文件之间的交互涉及文件的锁定。当某个进程正在对文件执行操作时,该文件的状态会被锁定,其他进程无法同时对其进行修改或删除。
如果有进程持续向某个文件写入数据,即使执行了删除操作,该文件的指针并不会立即从元数据中删除。内核会认为该文件仍然存在,因为有进程锁定了它。这就导致了磁盘空间没有被释放,即使你删除了文件,直到所有打开的文件描述符关闭并进程释放文件锁定,才会真正释放磁盘空间。
然而对于这样问题怎样解决呢?
首先在删除文件前进行,查看该文件写入的进程有没有停止,另一个就是不要盲目的就和博主一样直接就不管rm掉,rm前先进行停止运行的进程。就算和博主一样粗心大意的rm掉了也没关系可以通过以下措施进行补救:
使用lsof命令查找占用问题文件的进程:在终端中输入以下命令:
lsof | grep delete
该命令会列出正在占用问题文件的进程及其相关信息,包括进程ID(PID)。
终止占用问题文件的进程:
kill -9 <PID>
就可以释放了。
另外推荐一种不删除可以清除数据方式更加人性化
在清理文件时不使用 rm
命令删除文件,而是使用 >
或 /dev/null
来清除文件中的数据,而不删除文件本身。这将允许你释放文件的磁盘空间,同时保留文件的元数据和指针,以避免文件锁定问题。例如:
> filename # 使用空命令清除文件内容
# 或者
cat /dev/null > filename # 使用/dev/null清除文件内容