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

Tho*_*hle 4 logs logrotate mysql

我正在使用 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
Run Code Online (Sandbox Code Playgroud)

表明在 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
}
Run Code Online (Sandbox Code Playgroud)

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

任何想法可能会发生什么?

KM.*_*KM. 5

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

延迟压缩

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