使用 echo 空字符串覆盖日志文件来清理磁盘空间是一种危险的"软删除"方式,会导致稀疏文件问题。原因如下:
- 业务应用持有日志文件的文件描述符(fd),echo 覆盖后应用并不知道文件已被清空
- 应用继续使用之前的写入偏移量(例如已经写到第 100MB 位置),在旧位置继续写入
- 文件开头到旧偏移位置之间的区域变成 hole,被文件系统填充为 \0
- 文件逻辑大小不断累积增长,且每次清空都会叠加
正确的做法是在业务侧实现日志轮转机制,使用 rename 或 copytruncate 方式。rename 方式将当前文件重命名后让应用创建新文件;copytruncate 方式先复制内容再截断原文件。这两种方式都能安全地管理日志文件大小而不产生稀疏文件。