为什么 logrotate 在关闭文件之前会对其进行压缩

为什么 logrotate 在关闭文件之前会对其进行压缩

我正在使用 logrotate 来旋转 mysql 输出。当 cron 运行 logrotate 时,我经常收到一封包含以下内容的电子邮件:

error: Compressing program wrote following message to stderr when compressing log /var/log/mysql/mysqld.err-20150408:
gzip: stdin: file size changed while zipping

表明在 logrotate 移动文件并对其调用 gzip 后,该文件仍然打开并且 mysql 正在写入它。这是我的 mysql logrotate 配置:

/var/log/mysql/mysql.err /var/log/mysql/mysql.log /var/log/mysql/mysqld.err {
monthly
create 660 mysql mysql
notifempty
size 5M
sharedscripts
missingok
postrotate
[ -f /var/run/mysqld/mysqld.pid ] && /bin/kill -HUP `cat /var/run/mysqld/mysqld.pid`
endscript
}

这是 Gentoo 的 mysql 包附带的未修改的文件,所以我怀疑它有问题。我对其他日志的轮换没有任何问题。

有什么想法可能会发生什么吗?

答案1

gzip 错误消息几乎说明了正在发生的情况 - 文件在压缩期间被写入(在本例中是由 MySQL 写入)。尝试使用delaycompress(with compress);从手册页:

延迟压缩

将前一个日志文件的压缩推迟到下一个循环周期。这仅在与 compress 结合使用时才有效。当某些程序无法被告知关闭其日志文件并因此可能会继续写入先前的日志文件一段时间时,可以使用它。

相关内容