Por que o logrotate zipa um arquivo antes de ser fechado?

4

Estou usando o logrotate para girar a saída do mysql. Quando cron executa o logrotate, recebo freqüentemente um e-mail com o seguinte conteúdo:

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

indicando que após o logrotate ter movido o arquivo e chamado gzip, o arquivo ainda estava aberto e o mysql estava escrevendo para ele. Aqui está minha configuração do logrotate para o mysql:

/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
}

Este é o arquivo não modificado que é enviado com o pacote mysql do Gentoo, então eu duvido que haja problemas com ele. Não tenho problemas com outros logs sendo girados.

Alguma idéia do que pode estar acontecendo?

    
por Thomas Kahle 08.04.2015 / 14:13

1 resposta

4

A mensagem de erro gzip mostra praticamente o que está acontecendo - o arquivo está sendo gravado (pelo MySQL neste caso) durante a compactação. Tente usar delaycompress (com compress ); da página man:

delaycompress

Postpone compression of the previous log file to the next rotation cycle. This only has effect when used in combination with compress. It can be used when some program cannot be told to close its logfile and thus might continue writing to the previous log file for some time.

    
por 08.04.2015 / 14:44