如何在 Linux 上回收“已删除”但仍然使用的文件的存储?

如何在 Linux 上回收“已删除”但仍然使用的文件的存储?
SERVER:~ # df -mP /home/
Filesystem         1048576-blocks      Used Available Capacity Mounted on
/dev/mapper/rootvg-home_lv       496       491         0     100% /home
SERVER:~ # 
SERVER:/home # lsof | grep -i deleted | grep -i "home" | grep home
badprocess   4315     root  135u   REG      253,2   133525523      61982 /home/username/tr5J6fRJ (deleted)
badprocess2  44654     root  133u   REG      253,2   144352676      61983 /home/username/rr2sxv4L (deleted)
...
SERVER:/home # 

文件在仍在使用时被删除。所以它们仍然消耗空间。但我们不想重新启动“badprocess*”。操作系统是SLES9,但我们问的是“一般情况”。

问题:我们如何删除这些已删除的文件而不重新启动保存它们的进程,以便释放空间?

答案1

您可以使用 中的条目/proc来截断此类文件。

# ls -l /proc/4315/fd

这将显示进程 4315 打开的所有文件。您已经使用过lsof,并且显示删除的文件是文件描述符 135,因此您可以释放该删除的文件使用的空间,如下所示:

# > /proc/4315/fd/135

对于进程 44654 打开的另一个已删除文件也是如此,它的文件描述符为 133,因此:

# > /proc/44654/fd/133

您现在应该看到空间已被释放。

您还可以使用它来复制已被删除但仍由进程保持打开状态的文件的内容,只需cp /proc/XXX/fd/YY /some/other/place/filename.

答案2

如果没有连接到badprocess使用调试器或其他使用该ptrace()工具来操纵进程并导致其关闭某些文件的东西,我认为没有任何方法可以做到这一点。

您的标题谈到了锁,但您在问题正文中没有提到锁。无论如何,也没有办法强制进程放弃它对文件的锁定。无论文件是否仍然链接在文件系统中,情况都是如此。

相关内容