![如何使用 gzip 压缩、保留和清空原始文件](https://linux22.com/image/996197/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20gzip%20%E5%8E%8B%E7%BC%A9%E3%80%81%E4%BF%9D%E7%95%99%E5%92%8C%E6%B8%85%E7%A9%BA%E5%8E%9F%E5%A7%8B%E6%96%87%E4%BB%B6.png)
由于某种原因,我无法使用 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