如何使用 gzip 压缩、保留和清空原始文件

如何使用 gzip 压缩、保留和清空原始文件

由于某种原因,我无法使用 logotate 定期压缩文件。
所以我决定编写自己的脚本,这不是最难的事情,但一个小细节让我陷入困境。
当使用 zip 压缩文件时,logrotate 会保留原始文件并清空它们。我可以使用 gzip 然后 echo 来实现相同的结果,但假设我的应用程序正在将大量数据写入日志,那么在运行 gzip 之后和 echo 之前的时间戳中肯定会有一些日志丢失

gzip -k file.log
echo "" > file.log

你知道我该怎么做吗?我是否缺少一个可以清空原始文件的 gzip 选项?谢谢 :)

编辑

通过向进程(一个节点脚本)发送信号并强制它重新打开日志文件来解决,正如 AlexP 所建议的那样。

答案1

logrotate工作原理是(1)像使用一样重命名日志文件mv,(2)使用旧名称创建新文件,(3)以某种方式向写入日志文件的进程发出信号以关闭并重新打开它(这会将它们切换到新文件),最后(4)压缩重命名的文件。

棘手的步骤当然是 (3),因为如何告诉进程它应该关闭并重新打开其日志取决于具体进程。例如,如果您查看/etc/logrotate.d/apache2,它使用reload命令使 Apache HTTP Server 关闭并重新打开日志,而 则/etc/logrotate.d/samba显示对于 Samba,它发送信号 SIGHUP。

答案2

操作方法如下,打开终端并输入:

cat file.log | gzip -9 > tmp_file.gz && echo > file.log

相关内容