Linux rm未释放磁盘空间

Linux rm未释放磁盘空间,linux,tomcat,logging,Linux,Tomcat,Logging,我已经rm'ed了一个2.5gb的日志文件,但它似乎没有释放任何空间 我做到了: rm /opt/tomcat/logs/catalina.out 那么这个, df -hT 而df报告我的/opt装载率仍为100% 有什么建议吗?重新启动tomcat,如果文件正在使用中,并且您将其删除,则当该过程完成时,空间将变得可用。rm是否已记录/计划?尝试使用“sync”命令强制写入。如果某个文件仍处于打开状态,则该文件实际上不会消失。您可能需要以某种方式通知catalina关闭并重新打开其日志文件。

我已经
rm
'ed了一个2.5gb的日志文件,但它似乎没有释放任何空间

我做到了:

rm /opt/tomcat/logs/catalina.out
那么这个,

df -hT
df
报告我的
/opt
装载率仍为100%


有什么建议吗?

重新启动tomcat,如果文件正在使用中,并且您将其删除,则当该过程完成时,空间将变得可用。

rm是否已记录/计划?尝试使用“sync”命令强制写入。

如果某个文件仍处于打开状态,则该文件实际上不会消失。您可能需要以某种方式通知catalina关闭并重新打开其日志文件。

如果存在指向该文件的第二个硬链接,则在删除该链接之前,该文件不会被删除。

您的问题: 可能是一个正在运行的程序仍保留着该文件

您的解决方案: 根据这里的其他答案,您可以简单地关闭tomcat以阻止它保留文件

如果这不是一个选项,或者如果你只是想了解更多细节,那么看看这个问题:-它提出了一些更严厉的处理方法,可能对你的情况更有用


更多详情: linux/unix文件系统将“打开的”文件视为它们的另一个名称。rm从文件中删除“名称”,如目录树中所示。在句柄关闭之前,文件仍然有更多的“名称”,因此文件仍然存在。文件系统在完全未命名之前不会获取文件

这似乎有点奇怪,但这样做可以实现一些有用的功能,比如启用符号链接。符号链接基本上可以被视为同一文件的备用名称

这就是为什么在文件句柄上调用与close()等价的语言非常重要的原因。这会通知操作系统该文件不再被使用。虽然有时这是无法帮助的-这很可能是Tomcat的情况。请参阅以了解原因

根据文件系统的不同,这通常实现为一种引用计数,因此可能不涉及任何真实名称。如果像stdin和stderr这样的东西被重定向到一个文件或另一个bytestream(最常用于服务),它也会变得很奇怪

这整个想法与“”的概念密切相关,因此如果你是好奇型的人,我建议你先检查一下

讨论 它不再那么好用了,但是您过去可以更新整个操作系统,使用新的库启动新的http守护进程,最后在没有更多的客户端使用它时关闭旧的守护进程(释放旧的句柄)。http客户端甚至不会错过一个节拍


基本上,您可以从运行程序的“底层”彻底清除内核和所有库。但是,由于旧版本的“名称”仍然存在,因此该文件仍然存在于该特定程序的内存/磁盘中。然后是重新启动所有服务等问题。虽然这是一个高级使用场景,但这也是某些unix系统有多年运行记录的原因。

正如FerranB和Paul Tomblin在此线程中所指出的,文件正在使用,并且在关闭文件之前不会释放磁盘空间

问题在于,您无法向Catalina进程发出关闭Catalina.out的信号,因为文件句柄不在java进程的控制之下。当您启动Tomcat时,它是通过catalina.sh中的shell I/O重定向打开的。只有终止Catalina进程,才能关闭该文件句柄

有两种解决方案可以防止将来出现这种情况:

  • 不允许Tomcat应用程序的输出进入
    catalina.out
    。而是使用
    output
    属性,并为输出配置日志通道。由log4j管理的日志可以在不重新启动Catalina进程的情况下进行轮换

  • 将catalina.sh修改为管道输出,而不是简单地重定向到catalina.out。这样,cronolog将为您旋转日志


正如其他人所建议的,该文件可能仍由其他进程打开。要找出是哪一个,你可以这样做

lsof /opt/tomcat/logs/catalina.out

其中列出了流程。也许你会在列表中找到tomcat

重新启动Tomcat将释放Tomcat对文件的任何保留。但是,为了避免重新启动Tomcat(例如,如果这是一个生产环境,您不想不必要地关闭服务),您通常可以覆盖该文件:

cp /dev/null /opt/tomcat/logs/catalina.out
甚至更短更直接:

> /opt/tomcat/logs/catalina.out

在故障排除或磁盘清理过程中,我始终使用这些方法清除当前正在运行的服务器进程的日志文件。这将使inode保持独立,但会清除实际的文件数据,而尝试删除文件通常要么不起作用,要么至少会混淆正在运行的进程“日志编写器”。

最佳解决方案是使用“echo”(如@ejoncas”建议):

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

不要简单地使用“rm”删除此文件,因为首先必须停止写入该文件的过程,否则磁盘将无法释放


请参阅:

输入命令以检查哪些已删除的文件占用了内存

 $ sudo lsof | grep deleted
它将显示仍保留内存的已删除文件

然后用pid或name终止进程

$ sudo kill <pid>
$ df -h

提及任何大小,它将显示哪些文件占用超过阈值大小,并删除该文件

这是一个很好的观点,值得在同一文件系统上搜索另一个2.5GB文件(硬链接不能跨文件系统)。根据分区的总大小,使用-h可能不会显示太多变化。但正如其他人指出的,tomcat可能仍然打开文件。是的,你是对的——文件是以*nix计算的引用,只要有引用(即打开的fd),即使没有指向inode的链接,它仍然会在那里。最好的做法是
$ sudo kill <pid>
$ df -h
# cd /
# du --threshold=(SIZE)