Truncate/Delete 通过输出重定向“>”生成的日志文件内容

Truncate/Delete the log file contents which are generated via output redirection ">"

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

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

  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 Dec 2 11:30 sysout.log

然后 运行 截断 命令

[root@mylaptop ~]# truncate -s0 sysout.log
[root@mylaptop ~]# ls -lh sysout.log
-rw-r--r-- 1 root root 0 Dec 2 11:31 sysout.log

几秒钟后 2 行 日志消息打印到文件中。但是文件大小是

[root@mylaptop ~]# ls -lh sysout.log
-rw-r--r-- 1 root root 6.3K Dec 2 11:31 sysout.log

如您所见,它增加了文件大小。
如何释放磁盘space?或者还有其他方法吗?

对于以写入模式打开文件(使用“>”或其他方式)的长 运行 进程,该进程会跟踪下一次写入的偏移量。即使文件大小被截断为 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模式。