rm没有释放磁盘空间

时间:2008-12-01 23:54:56

标签: linux tomcat logging

rm编了一个2.5gb的日志文件 - 但它似乎没有释放任何空间。

我做了:

rm /opt/tomcat/logs/catalina.out

然后这个:

df -hT

df报告我的/opt装载仍然使用了100%。

有什么建议吗?

10 个答案:

答案 0 :(得分:67)

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

答案 1 :(得分:22)

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

lsof /opt/tomcat/logs/catalina.out

列出了流程。可能你会在该列表中找到tomcat。

答案 2 :(得分:10)

你的问题:

正在运行的程序仍然可以保留文件。

您的解决方案:

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

如果这不是一个选项,或者您只是想了解更多详细信息,请查看以下问题:Find and remove large files that are open but have been deleted - 它会提出一些更为严厉的方法来处理它,这可能对您的情况更有用。


更多详情:

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

看起来有点奇怪,但这样做可以实现启用符号链接等有用的功能。符号链接基本上可以视为同一文件的备用名称。

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

根据文件系统的不同,这通常作为一种引用计数实现,因此可能不涉及任何实名。如果将stdin和stderr之类的东西重定向到文件或其他字节流(最常见的是服务),也会变得奇怪。

这整个想法与“inodes”的概念密切相关,所以如果你是好奇的类型,我建议先检查一下。

讨论

它不再运行得那么好了,但是你曾经能够更新整个操作系统,使用新的库启动一个新的http-daemon,最后在没有更多客户端服务时关闭旧的http-daemon它(释放旧手柄)。 http客户端甚至不会错过任何一个节拍。

基本上,您可以完全消除内核以及“从下面”运行程序的所有库。但由于旧版本的“名称”仍然存在,因此该文件仍存在于该特定程序的内存/磁盘中。然后,这将是重新启动所有服务等问题。虽然这是一个高级使用场景,但这是为什么一些unix系统有多年的正常运行时间的原因。

答案 3 :(得分:9)

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

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

甚至更短更直接:

> /opt/tomcat/logs/catalina.out

我一直使用这些方法在故障排除或磁盘清理过程中清除当前正在运行的服务器进程的日志文件。这样就留下了inode,但是清除了实际的文件数据,而尝试删除文件通常不起作用,或者至少混淆正在运行的进程的日志编写器。

答案 4 :(得分:6)

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

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

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

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

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

答案 5 :(得分:5)

最好的解决方案是使用'echo'(如@ejoncas的建议):

$ echo '' > huge_file.log  

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

不要只使用'rm'删除此文件,因为首先必须停止写入它的过程,否则磁盘将不会被释放。

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

答案 6 :(得分:3)

如果某些内容仍然打开,该文件实际上不会消失。您可能需要以某种方式发出catalina信号以关闭并重新打开其日志文件。

答案 7 :(得分:3)

如果该文件有第二个硬链接,那么在删除之前不会删除它。

答案 8 :(得分:2)

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

 $ sudo lsof | grep deleted

它将显示仍保留内存的已删除文件。

然后使用pid或名称

终止进程
$ sudo kill <pid>
$ df -h

现在检查你将拥有相同的内存

如果没有输入以下命令来查看占用内存的文件

# cd /
# du --threshold=(SIZE)

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

答案 9 :(得分:-2)

rm记录/预定?尝试'sync'命令强制写入。