当我将自己服务器上运行的java程序进行日志切割的时候,发现无法清空原日志文件,执行清空命令后,日志文件不会减小并且会产生乱码。经过查找资料,得知原来是产生了文件空洞。
文件空洞:文件内容的大小小于文件磁盘占用的空间
如果服务器上java程序使用:nohup java -jar demo.jar > log.txt 2>&1 &
方式启动java程序,随着日志内容的增多,需要清理日志文件,如果只是经过重命名或删除或vim编辑日志文件的方式清除文件内容时,因为java程序没有中止,这样会致使输出的日志文件的fd仍是指向原来文件,那么新添加的日志内容将无法写到日志文件中去。
若采用命令:echo "" > log.txt
此时日志文件内容被清空,通过命令:ll log.txt
发现文件磁盘占用空间变小了,由原来的几G变到几b,而后过几秒后有新的日志内容输入时,文件磁盘空间忽然变到原来的几G,这就是所谓的文件空洞的具体表现。打开日志文件发现内容清空,但实际上写入的位置没有重置到文件起始位置,为覆盖写;所以从新写放时都以null值占用。
解决方法:将日志输出改为追加写nohup java -jar demo.jar >> log.txt 2>&1 &
这样在清空文件时,写入位置置零,追加写入会从起始位置开始写入,不会产生文件空洞。