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

Bash 截断/删除通过输出重定向生成的日志文件内容“>”,bash,shell,file,truncate,Bash,Shell,File,Truncate,问题是,下面列出的所有命令都会使文件大小为0,但会持续一段时间。 生成新日志时,日志文件大小为=旧文件大小预截断+新日志消息大小。 这意味着truncate不会释放文件占用的磁盘空间。 文件大小应该是truncate命令之后出现的新日志消息的大小 在问这个问题之前,我尝试了以下选项 $>sysout.log $:>sysout.log $cat/dev/null>sysout.log $cp/dev/null sysout.log $dd if=/dev/null of=sysout.log $

问题是,下面列出的所有命令都会使文件大小为0,但会持续一段时间。 生成新日志时,日志文件大小为=旧文件大小预截断+新日志消息大小。 这意味着truncate不会释放文件占用的磁盘空间。 文件大小应该是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 Dec 2 11:30 sysout.log

然后运行truncate命令

[root@mylaptop~]截断-s0 sysout.log [root@mylaptop~]ls-lh sysout.log -rw-r-r-1根根目录0 Dec 2 11:31 sysout.log

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

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

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

对于使用'>'以写模式打开文件的长时间运行的进程,或者,该进程跟踪下一次写入的偏移量。即使文件大小被截断为0,下一次写入也将在最后一个位置继续。根据描述,最有可能的情况是长时间运行的进程继续以旧的偏移量进行日志记录,从而在文件的开头留下大量的零字节数据

通过检查文件进行验证-初始内容是否消失? 解决方案很简单,不用写模式登录,而是使用附加模式


请注意,所有写入进程和连接都应使用附加模式。

如果进程保持运行,则可能是守护进程,则这些日志将保持填充。或者使用原木旋转机构如何?或者你也可以用脚本的形式编写相同的命令,然后将它们放在crontab中进行计划运行。谢谢@RavinderSingh13,是的,我将为此编写一个crontab。但问题是,我想检查文件大小,如果大于5GB,则将日志复制到S3,然后截断文件。这里,在截断之后,它不会释放文件大小,然后在特定时间之后,作业会非常频繁地将文件复制到S3。请告诉我有关日志旋转机制的情况。@AniketKulkarni:如果没有其他进程打开日志文件并不断输入它,我将无法再现这种效果。例如,我做了一个ls>out.txt;截断-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是一种实现这一点的机制。解决方案成功了。感谢您对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.