Bry*_*anK 31 lsof open-files deleted-files
嗨,我有许多文件已被删除,但由于某种原因,与已删除文件相关的磁盘空间无法使用,直到我明确终止占用磁盘空间的文件的进程
$ lsof /tmp/
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
cron 1623 root 5u REG 0,21 0 395919638 /tmp/tmpfPagTZ4 (deleted)
Run Code Online (Sandbox Code Playgroud)
上面删除的文件占用的磁盘空间会导致问题,例如在尝试使用 Tab 键自动完成文件路径时出现错误 bash: cannot create temp file for here-document: No space left on device
但是在我运行kill -9 1623该 PID 的空间后,我不再收到错误消息。
我的问题是:
请让我知道我使用过的任何不正确的术语或与这种情况相关的任何其他相关信息。
ori*_*ion 31
在 unices 上,文件名只是指向文件所在内存(可以是硬盘驱动器甚至 RAM 支持的文件系统)的指针(inode)。每个文件都记录了指向它的链接数:链接可以是文件名(复数,如果同一个文件有多个硬链接),也可以是每次打开文件时,该进程实际上持有“链接”到同一个空间。
仅当没有剩余链接时,空间才会被物理释放(因此,不可能到达它)。这是唯一明智的选择:在使用文件时,其他人是否无法再访问它并不重要:您正在使用它,直到您关闭它,您仍然可以控制它 - 您甚至不会注意到文件名消失或移动或其他任何东西。这甚至用于临时文件:一些实现创建一个文件并立即取消链接它,因此它在文件系统中不可见,但创建它的进程正在正常使用它。Flash 插件特别喜欢这种方法:所有下载的视频文件都保持打开状态,但文件系统不显示它们。
所以,答案是,虽然进程仍然打开文件,但您不应该期望获得空间。它没有被释放,它正在被积极使用。这也是应用程序在使用完文件后应该真正关闭文件的原因之一。在正常使用中,您不应该认为该空间是免费的,这也根本不应该很常见 - 除了故意取消链接的临时文件之外,实际上不应该有任何您想要的文件考虑未使用,但仍然打开。尝试查看是否有一个过程经常执行此操作并考虑如何使用它,或者只是找到更多空间。
und*_*ine 26
文件从文件系统中删除,其中删除了对此 inode 的任何引用。参考可以在磁盘上(任何目录中的链接),也可以来自打开的应用程序。如果您删除文件 - 您只会从磁盘中删除引用,但是 - 仍然存在来自应用程序的引用。
您可以通过两种方式“释放”空间:
如果你知道 pid - 看看这个 pid 打开了哪些文件: ls -l /proc/PID/fd 你在这里看到的链接如下:
undefine@uml:~$ ls -l /proc/18596/fd 雷泽姆 0 lrwx------ 1 undefine undefine 64 lut 1 00:06 0 -> /dev/pts/30 lrwx------ 1 undefine undefine 64 lut 1 00:06 1 -> /dev/pts/30 lrwx------ 1 undefine undefine 64 lut 1 00:05 2 -> /dev/pts/30 lr-x------ 1 undefine undefine 64 lut 1 00:06 3 -> /home/undefine/x(已删除) lr-x------ 1 undefine undefine 64 lut 1 00:06 4 -> anon_inode:inotify
如您所见 - 3 fd 被删除。您可以通过命令截断它(例如):
undefine@uml:~$ :>/proc/18596/fd/3 undefine@uml:~$
请记住,如果应用程序从该文件中读取 - 这对他们来说可能是危险的。但是 - 如果它只是一个日志文件 - 你可以安全地截断它。
小智 12
正如其他人所说,lsof可用于列出由于打开的文件描述符而仍在磁盘上的所有已删除文件。然而,这可能是一个很长的清单。这是一个命令,它列出了按字节升序大小排序的这些文件:
sudo lsof -F sn0 | tr -d '\000' | grep deleted | sed 's/^[a-z]*\([0-9]*\)n/\1 /' | sort -n
Run Code Online (Sandbox Code Playgroud)
可能有更简洁的方法来执行此操作,但上述命令对我有用。
该空间不会立即释放,因为正在运行的进程仍然具有刚删除的文件的打开文件句柄。毕竟,如果一个进程仍在尝试使用一个文件,您可能真的不希望内核摆脱它(文件)。这可能会使这个过程有点不安。最好的(也是唯一的,据我所知)释放空间的方法就是做你所做的 - 终止进程。