【发布时间】:2020-03-27 17:34:03
【问题描述】:
问题是,下面列出的所有命令都会使文件大小为 0(零),但有一段时间。
生成新日志时,日志文件大小 = 旧文件大小(截断前)+ 新日志消息大小。
这意味着截断不会释放文件占用的磁盘空间。
文件大小应该是 truncate 命令之后出现的新日志消息的大小。
在问这个问题之前,我已经尝试了以下选项。
- $ > sysout.log
- $ : > sysout.log
- $ cat /dev/null > sysout.log
- $ cp /dev/null sysout.log
- $ dd if=/dev/null of=sysout.log
- $ echo "" > sysout.log
- $ echo -n "" > sysout.log
- $ truncate -s 0 sysout.log
首先,我检查了文件大小(包含 10 行的日志消息)
[root@mylaptop ~]# ls -lh sysout.log
-rw-r--r-- 1 root root 6.0K 12 月 2 日 11:30 sysout.log
然后运行截断命令
[root@mylaptop ~]# truncate -s0 sysout.log
[root@mylaptop ~]# ls -lh sysout.log
-rw-r--r-- 1 根 0 12 月 2 日 11:31 sysout.log
几秒钟后,2 行 日志消息打印到文件中。但是文件大小是
[root@mylaptop ~]# ls -lh sysout.log
-rw-r--r-- 1 根 6.3K 12 月 2 日 11:31 sysout.log
如您所见,它增加了文件大小。
如何释放磁盘空间?还是有其他方法?
【问题讨论】:
-
如果一个进程一直在运行(可能是一个守护进程),那么这些日志将被不断填充。使用日志轮换机制怎么样?或者您可以以脚本形式编写相同的命令,然后将它们放在 crontab 中以进行预定运行。
-
谢谢@RavinderSingh13,是的,我要为此编写一个 crontab。但问题是,我想检查文件大小,如果大于 5GB,则将日志复制到 S3,然后截断文件。在这里,截断后它不会释放文件大小,然后在一定时间后作业会非常频繁地将文件复制到 S3。请告诉我日志轮换机制。
-
@AniketKulkarni :如果有 no 其他进程打开了日志文件并继续输入它,我无法重现效果。比如我做了一个
ls > out.txt; truncate -s 0 out.txt; touch out.txt; echo abc >>out.txt,文件out.txt只包含abc,没有别的。 -
@user1934428:文件由命令创建:“java - jar my_app.jar > sysout.log 2>&1 &”。所以它不断地获取数据。
-
对于每一个你想管理的日志,你必须检查生成它的守护进程;你可以(经常)向那个守护进程发送一个信号,告诉它“重新启动你的日志”。您必须查阅守护程序文档。 Logrotate 是一种实现这一点的机制。