RM不释放磁盘空间

我已经编了一个2.5GB的日志文件 – 但似乎没有释放任何空间。

我做了:

 rm /opt/tomcat/logs/catalina.out 

那么这个:

 df -hT 

df报告我的/opt安装仍然在100%使用。

有什么build议么?

重新启动tomcat,如果文件正在使用中,并且将其删除,则当该进程结束时,该空间变为可用。

正如其他人所build议的,该文件可能仍然被其他进程打开。 要找出哪些,你可以做

 lsof /opt/tomcat/logs/catalina.out 

其中列出你的过程。 可能你会在那个列表中findtomcat。

你的问题:

有可能一个正在运行的程序仍然保留在文件中。

解决scheme:

根据这里的其他答案,你可以简单地closurestomcat,以阻止它保持到文件。

如果这不是一个选项,或者如果你只是想要更多的细节,看看这个问题: find并删除已打开,但已被删除的大文件 – 它提出了一些更加严厉的方式来处理它可能是更有用的情况下。


更多细节:

linux / unix文件系统认为“打开”文件是他们的另一个名字。 rm从文件中删除目录树中的“名称”。 直到句柄closures,文件仍然有更多的“名称”,所以文件仍然存在。 文件系统在完全未命名之前不会收获文件。

这看起来可能有些奇怪,但是这样做有助于启用符号链接等有用的function。 符号链接本质上可以被视为同一个文件的替代名称。

这就是为什么总是在文件句柄上调用与close()等价的语言非常重要的原因 。 这通知操作系统该文件不再被使用。 虽然有时候这不能得到帮助 – Tomcat可能就是这样。 参考比尔·卡尔文的答案来解释为什么。

根据文件系统的不同,这通常是作为一种引用计数来实现的,所以可能没有涉及真实的名字。 如果像stdin和stderr这样的东西被redirect到一个文件或另一个字节stream(最常用的是服务),它也会变得很奇怪。

这整个想法与' inodes '的概念密切相关,所以如果你是好奇的types,我build议先检查一下。

讨论

它不能很好地工作了,但是你以前能够更新整个操作系统,使用新的库启动一个新的http守护进程,并且在没有更多的客户端正在服务的时候closures旧的守护进程旧的手柄)。 http客户甚至不会错过一个节拍。

基本上,你可以完全清除内核和所有“从下面”运行程序的库。 但是由于旧名称仍然存在“名称”,该文件仍然存在于该特定程序的内存/磁盘中。 那么这将是一个重新启动所有的服务等问题。虽然这是一个先进的使用情况,这是一些unix系统有多年的正式logging的原因。

重新启动Tomcat将释放Tomcat对该文件的任何保留。 但是,为了避免重新启动Tomcat(例如,如果这是一个生产环境,而且你不想一下子把服务closures),通常可以覆盖文件:

 cp /dev/null /opt/tomcat/logs/catalina.out 

甚至更短,更直接:

 > /opt/tomcat/logs/catalina.out 

在排除故障或清理磁盘的过程中,我始终使用这些方法清除当前正在运行的服务器进程的日志文件。 这会使inode单独存在,但会清除实际的文件数据,而试图删除文件通常不起作用,或者至less会使正在运行的进程的日志写入器混淆。

正如FerranB和Paul Tomblin在此线程中指出的那样,该文件正在使用中,直到文件closures,磁盘空间才会被释放。

问题是你不能发信号给Catalina进程closurescatalina.out ,因为文件句柄不在java进程的控制之下。 当你启动Tomcat时,它在catalina.sh被shell I / Oredirect打开。 只有通过终止Catalina进程才能closures文件句柄。

有两种解决scheme可以防止这种情况发生:

  • 不要让Tomcat应用程序的输出进入catalina.out 。 而是使用swallowOutput属性,并configuration日志通道输出。 由log4jpipe理的日志可以在不重新启动Catalina进程的情况下进行轮换。

  • 修改catalina.sh到pipe道输出到cronolog,而不是简单地redirect到catalina.out 。 这样cronolog会旋转日志给你。

最好的解决scheme是使用“回声”(作为@ejoncas的build议):

 $ echo '' > huge_file.log 

此操作非常安全快速(每秒除去大约1G数据),尤其是在生产服务器上运行时。

不要简单地使用'rm'来删除这个文件,因为首先你必须停止写这个进程,否则磁盘将不会被释放。

参考: http : //siwei.me/blog/posts/how-to-deal-with-huge-log-file-in-production

如果有东西仍然打开,文件将不会真正消失。 您可能需要以某种方式指示catalinaclosures并重新打开其日志文件。

如果有第二个硬链接到文件,那么它将不会被删除,直到它被删除。

是否logging/预定? 尝试“同步”命令强制写入。