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()
工具来操纵进程并导致其关闭某些文件的东西,我认为没有任何方法可以做到这一点。
您的标题谈到了锁,但您在问题正文中没有提到锁。无论如何,也没有办法强制进程放弃它对文件的锁定。无论文件是否仍然链接在文件系统中,情况都是如此。