【问题标题】:Truncate/Delete the log file contents which are generated via output redirection ">"截断/删除通过输出重定向生成的日志文件内容“>”
【发布时间】:2020-03-27 17:34:03
【问题描述】:

问题是,下面列出的所有命令都会使文件大小为 0(零),但有一段时间。
生成新日志时,日志文件大小 = 旧文件大小(截断前)+ 新日志消息大小
这意味着截断不会释放文件占用的磁盘空间
文件大小应该是 truncate 命令之后出现的新日志消息的大小。

在问这个问题之前,我已经尝试了以下选项。

  1. $ > sysout.log
  2. $ : > sysout.log
  3. $ cat /dev/null > sysout.log
  4. $ cp /dev/null sysout.log
  5. $ dd if=/dev/null of=sysout.log
  6. $ echo "" > sysout.log
  7. $ echo -n "" > sysout.log
  8. $ 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 是一种实现这一点的机制。

标签: bash shell file truncate


【解决方案1】:

对于以写入模式打开文件的长时间运行的进程(使用“>”或其他方式),该进程会跟踪下一次写入的偏移量。即使文件大小被截断为 0,下一次写入也会在最后一个位置恢复。最有可能的是,根据描述,长时间运行的进程继续在旧的偏移量处记录(实际上在文件的开头留下了大量的零字节数据。

  • 通过检查文件进行验证 - 初始内容是否消失了?

解决方法很简单,不用write模式登录,使用append模式。

# Start with a clean file
rm -f sysout.log
# Force Append mode.
java - jar my_app.jar >> sysout.log 2>>&1 &

... 
truncate ...
# New data should be written to the START of the file, based on truncated size.

注意所有的写入过程和连接都应该使用append模式。

【讨论】:

  • 解决方案有效。感谢您对writeappend 的解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-17
  • 1970-01-01
  • 2016-10-07
  • 1970-01-01
  • 1970-01-01
  • 2019-03-20
  • 1970-01-01
相关资源
最近更新 更多