如何找到已删除但仍在应用程序中打开的大文件?即使进程已打开,如何删除该文件?
情况是,我们正在运行一个进程,该进程正在以惊人的速度填充日志文件。我知道原因,并且我可以解决它。在此之前,我想在不关闭进程的情况下rm或清空日志文件。
简单地执行rm output.log
操作只会删除对文件的引用,但是它会继续占用磁盘上的空间,直到进程终止。更糟糕的是:rm
ing之后,我现在无法找到文件的位置或文件的大小!有什么方法可以找到文件,甚至可以在另一个进程中打开它,也可以将其清空?
我专门指的是基于Linux的操作系统,例如Debian或RHEL。
如果无法终止应用程序,则可以截断而不是删除日志文件来回收空间。如果未在附加模式(带有O_APPEND
)下打开文件,则文件将与下一次应用程序写入文件时一样大(尽管前导部分稀疏并且看起来好像包含NUL字节),但是空格将被回收(这不适用于Apple OS / X上不支持稀疏文件的HFS +文件系统)。
截断它:
: > /path/to/the/file.log
如果已将其删除,则在Linux上,您仍然可以通过以下方式截断它:
: > "/proc/$pid/fd/$fd"
$pid
打开文件的进程的进程ID在哪里,打开$fd
文件的文件描述符在哪里(您可以使用进行检查)lsof -p "$pid"
。
如果您不知道该pid,并且正在查找已删除的文件,则可以执行以下操作:
lsof -nP | grep '(deleted)'
lsof -nP +L1
,如@ user75021所提到的,是一个更好的选择(更可靠,更可移植)(列出链接少于1个的文件)。
或(在Linux上):
find /proc/*/fd -ls | grep '(deleted)'
或使用以下命令查找较大的zsh
:
ls -ld /proc/*/fd/*(-.LM+1l0)
如果应用程序是动态链接的,则另一种方法是将调试器附加到该应用程序并使其调用,close(fd)
然后再调用new open("the-file", ....)
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句