Propósito de “postrotate invoke-rc.d rsyslog rotate” quando logrotating, e este comando está desatualizado?

3

Ao usar o logrotate para manter os arquivos de log em rotação, vi

postrotate
                invoke-rc.d rsyslog rotate > /dev/null
endscript

Eu sei que o postrotate faz o bash executar o seguinte comando depois que o arquivo de log é girado, mas qual é a finalidade deste comando ser executado exatamente?

Finalmente, está desatualizado? (Parece que vi uma mensagem de anacron dizendo "O script que você está tentando invocar foi convertido em um Upstart trabalho, mas a rotação não é suportada para tarefas Upstart. ")

    
por fpghost 12.01.2014 / 14:35

2 respostas

4

Eu tive um problema parecido, e parece que a configuração do rsyslog para logrotate está quebrada, então ao invés de chamar service rsyslog rotate que realmente funciona, ele usa reload rsyslog ou similar. Acontece que este foi realmente um bug , que foi corrigido na versão 7.4.4-1ubuntu5 , mas minha instalação do Ubuntu 14.04 só vê a versão 7.4.4-1ubuntu2 no apt.

Esta é a correção que funcionou para mim:

Edite o arquivo /etc/logrotate.d/rsyslog , substituindo a linha dentro do bloco postrotate (por exemplo, reload rsyslog ou invoke-rc.d rsyslog rotate ) por isso:

service rsyslog rotate >/dev/null 2>&1 || true

É assim que o bloco deve ficar:

postrotate
    service rsyslog rotate >/dev/null 2>&1 || true
endscript

Com todas as linhas circundantes mantidas como estão.

Como último passo, pode ser uma boa ideia executar o comando manualmente uma vez:

service rsyslog rotate
    
por Markus Amalthea Magnuson 11.08.2014 / 00:27
3

O objetivo do comando é forçar o rsyslog a reabrir os arquivos que está usando para gravar logs. É usado depois que o logrotate move os arquivos antigos, então o rsyslog começa a escrever para os novos.

Exemplo: o rsyslog grava a maioria de suas coisas em / var / log / syslog. Quando o logrotate entra em ação, ele move este arquivo para /var/log/syslog.1 e cria um novo / var / log / syslog vazio. Mas como você provavelmente sabe (mas apenas no caso), o rsyslog não está escrevendo para um arquivo chamado / var / log / syslog, mas para um descritor de arquivo ele obteve a primeira vez que abriu o arquivo. Você pode mover o arquivo associado e o rsyslog continuaria escrevendo para ele, porque ele só sabe sobre o descritor de arquivo. Quando você move / var / log / syslog para /var/log/syslog.1, o rsyslog continuará escrevendo para /var/log/syslog.1, porque é para isso que seu descritor de arquivo aponta. Na verdade, você poderia até excluir o arquivo e o rsyslog continuaria escrevendo. É o que acontece quando os arquivos excluídos parecem ocupar espaço: os descritores de arquivo ainda estão abertos e, portanto, o espaço não é liberado. Isso só acontece quando a última referência ao arquivo é fechada.

O argumento "rotate" tem como objetivo forçar o lançamento de descritores de arquivos antigos e informar ao rsyslog que ele deve abrir os arquivos novamente, para que ele possa descartar novos arquivos para os novos arquivos e os antigos sejam descartados corretamente .

Quanto a estar desatualizado, receio não saber. Isso é o que me levou à sua pergunta O :-) Mas acredito que o problema é que a configuração do upstart não está pronta para aceitar essa opção. Eu substituí-lo com isso, a partir da página man:

kill -HUP $(cat /var/run/rsyslogd.pid)

Qual é o que "girar" fez, de qualquer maneira. Espero que ajude.

    
por rsuarez 12.03.2014 / 09:59