Configurar o tempo do sistema de volta prejudica a operação de logrotate?

4

Estou trabalhando em um sistema Linux embutido, onde o sistema de arquivos raiz é montado a partir de um cartão SD. Embora muitos sistemas como este montem apenas /var/log em um ramdisk, eu gostaria de salvar os logs no SDcard para gravar eventos importantes, então deixei o logrotate operacional como de costume para que o SDcard não seja completamente preenchido.

Infelizmente, este sistema não tem uma bateria fazendo backup do RTC, portanto, se o sistema for desligado e ligado novamente, a hora do sistema voltará para 1º de janeiro de 1970. Nessa situação, executei o logrotate uma vez e verifiquei o configuração de logrotate com logrotate -d /etc/logrotate.conf :

# logrotate -d /etc/logrotate.conf 
reading config file /etc/logrotate.conf
including /etc/logrotate.d
reading config file syslog
reading config info for /var/log/cron /var/log/debug /var/log/maillog /var/log/messages /var/log/secure /var/log/spooler /var/log/syslog 
reading config info for /var/log/wtmp 
reading config info for /var/log/btmp 
error: bad year 1970 for file /var/log/syslog in state file /var/lib/logrotate.status

Handling 3 logs

rotating pattern: /var/log/cron /var/log/debug /var/log/maillog /var/log/messages /var/log/secure /var/log/spooler /var/log/syslog  weekly (4 rotations)
empty log files are rotated, old logs are removed
considering log /var/log/cron
  log does not need rotating
considering log /var/log/debug
  log does not need rotating
considering log /var/log/maillog
  log does not need rotating
considering log /var/log/messages
  log does not need rotating
considering log /var/log/secure
  log does not need rotating
considering log /var/log/spooler
  log does not need rotating
considering log /var/log/syslog
  log does not need rotating
not running postrotate script, since no logs were rotated

rotating pattern: /var/log/wtmp  monthly (1 rotations)
empty log files are rotated, only log files >= 1048576 bytes are rotated, old logs are removed
considering log /var/log/wtmp
  log does not need rotating

rotating pattern: /var/log/btmp  monthly (1 rotations)
empty log files are rotated, old logs are removed
considering log /var/log/btmp
  log does not need rotating
error: could not read state file, will not attempt to write into it

Observe que o syslog tem um ano ruim em 1970 no arquivo de status do logrotate /var/log/logrotate.status , que é mostrado assim:

logrotate state -- version 2
"/var/log/syslog" 1970-1-1
"/var/log/debug" 1970-1-1
"/var/log/wtmp" 1970-1-1
"/var/log/spooler" 1970-1-1
"/var/log/btmp" 1970-1-1
"/var/log/maillog" 1970-1-1
"/var/log/httpd/*_log" 1970-1-1
"/var/log/wpa_supplicant.log" 1970-1-1
"/var/log/secure" 1970-1-1
"/var/log/mcelog" 1970-1-1
"/var/log/messages" 1970-1-1
"/var/log/cron" 1970-1-1
"/var/log/vsftpd.log" 1970-1-1

E, no final, ele diz que não tentará gravar no arquivo de estado, então agora estou preocupado se isso significa que os logs não serão rotacionados corretamente. Alguém sabe o que acontece para logrotate quando algo assim ocorre?

A chance de falta de energia onde o sistema será instalado é baixa, então eu prefiro deixar o tempo configurado corretamente, mas eu realmente gostaria de confirmar que, no caso de falha, o logrotate não será danificado.

    
por Claudio 24.01.2013 / 14:57

2 respostas

1

O arquivo de status do logrotate é usado para rastrear quando um log diário foi girado pela última vez . Parece estar disposto a escrever uma data fictícia como 1970, ou 1907, no caso de um sistema embutido meu. No entanto, quando é a próxima execução, ele rejeita a data em seu próprio arquivo de status e não gira os registros.

Eu trabalhei em torno disso apenas excluindo o arquivo de status. Isso significa que, quando o logrotate for executado na próxima vez, ele assumirá que não é necessário girar os logs para outro dia, o que é bom para mim.

Uma solução melhor seria modificar o script cron logrotate para primeiro verificar se o relógio está sincronizado com ntpq / ntpdate. Na verdade, a maneira mais fácil de adaptar isso a um script é usar check_ntp_time na distribuição nagios-plugins padrão, como /usr/lib/nagios/plugins/check_ntp_time -H pool.ntp.org

Em seguida, apenas verifique se o código de retorno é 0 antes de permitir que o logrotate seja executado.

Você também pode fazer uma chamada para o ntpdate no script cron do logrotate ou nos scripts de inicialização.

Além disso, certifique-se de que o cron esteja configurado para enviar e-mails quando tarefas agendadas falharem; A maneira mais fácil de tornar isso possível é instalar ssmtp .

    
por 09.04.2013 / 17:11
0

uma solução alternativa ao inserir

sed -i '/1970-1/d' /var/lib/logrotate.status

no script logrotate /etc/cron.daily/logrotate

    
por 21.04.2015 / 11:00