问题是,下面列出的所有命令都会使文件大小为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个根 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
如您所见,它会增加文件大小。
如何释放磁盘空间?还是还有其他方法?
答案 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
模式。