Logrotate na Spdc00
Description
O /var/log/srm-spdc00Domain.log eventualmente fica gigante, enchendo o /var da spdc00. A idéia é rotacionar (fazer backup e criar novos arquivos de log) esse log usando o logrotate, acionado via crontab.
A configuraćão é feita no /etc/logrotate.conf:
# rotate log files weekly
weekly
# keep 4 weeks worth of backlogs
rotate 4
# create new (empty) log files after rotating old ones
create
# uncomment this if you want your log files compressed
compress
# system-specific logs may be also be configured here.
/var/log/srm-spdc00Domain.log {
weekly
create 0664 root root
size 250M
rotate 1
}
As primeira linhas afetam o desempenho global do logrotate, que será feito semanalmente, manterá os últimos quatro arquivos de backup, criará novos e irá comprimir ( no caso ficaria arquivo.1.gz, arquivo.2.gz, arquivo.3.gz e arquivo.4.gz). Inclui na ultima linha as instrućões específicar a esse log, semanalmente, irá criar um novo no lugar com permissão 664 pertencente ao root, grupo root, o tamanho máximo será de 250 Mb e manterá somente uma cópia do anterior (srm-spdc00Domain.log.1.gz).
O problema é que rodando
logrotate /etc/logrotate.conf
realmente ele limpava, mas não preenchia o arquivo de log. Este ficava ainda rodando no anterior, como dava para ver usando
lsof /dev/sda5
(sda5 é o /var). Ficava um processo rodando no arquivo de log deletado. Isso é resolvido mantando o processo e automaticamente ele migra para o novo log.
Bom, inclui no /etc/cron.daily/logrotate uma linha que fizesse esse servico:
#!/bin/sh
/usr/sbin/logrotate /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
/usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
lsof /dev/sda5| grep "deleted"|tail -1|cut -f7-10 -d' '|xargs kill -9
exit 0
A sexta linha faz o servico: passa o lsof no /var e usando o grep seleciona as linha com deleted. As vezes são redundantes então selecionamos uma com o tail e escolhemos o campo que tem o pid do processo usando o cut, que é passado como argumento para o kill -9.
Updates
Marco em 15/04/2007
O /etc/cron.daily/logrotate ficou finalmente assim
#!/bin/sh
/usr/sbin/logrotate /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
/usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
DELPID=`lsof /dev/sda5|tr -s ' ' ' ' |grep "srm-spdc00Domain"| grep "deleted"|tail -1|cut -f2 -d' '`
while [ "$DELPID" ]; do
kill -9 $DELPID
DELPID=`lsof /dev/sda5|tr -s ' ' ' ' |grep "srm-spdc00Domain"| grep "deleted"|tail -1|cut -f2 -d' '`
done
exit 0
Assim elimina o problema da saída esquisita do lsof que as vezes não permitia que o processo fosse morto e também evita a enxurrada de e-mails de log quando o arquivo não é removido, devido ao erro do rm por não ter argumento.
Ciclano em dd/mm/aaaa
Mais comentarios