截断/删除通过输出重定向“>”生成的日志文件内容

时间:2019-12-03 04:30:14

标签: bash shell file truncate

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

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

  
      
  1. $> sysout.log
  2.   
  3. $:> sysout.log
  4.   
  5. $ cat / dev / null> sysout.log
  6.   
  7. $ cp / dev / null sysout.log
  8.   
  9. $ dd if = / dev / null of = sysout.log
  10.   
  11. $ echo“”> sysout.log
  12.   
  13. $ echo -n“”> sysout.log
  14.   
  15. $ truncate -s 0 sysout.log
  16.   

首先,我检查了文件大小(包含 10行日志消息)

  

[root @ mylaptop〜]#ls -lh sysout.log
  -rw-r--r-- 1个根 6.0K 12月2日11:30 sysout.log

然后运行 truncate 命令

  

[root @ mylaptop〜]#截断-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

如您所见,它会增加文件大小。
如何释放磁盘空间?还是还有其他方法?

1 个答案:

答案 0 :(得分: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模式。