Divide o arquivo de log grande com o sufixo como do logrotate

2

depois que eu vi que eu esqueci de adicionar um logrotate-conf para php5-fpm.log em um servidor, e agora vendo que ele cresceu REALMENTE grande, eu estou me perguntando como dividir este arquivo de log em separado , com um sufixo como logrotate produziria. Você sabe ... como esse erro nunca aconteceu :-P

Mas o mais próximo que eu cheguei é:

split -C 10m -d php5-fpm.log php5-fpm.log.

... mas isso está produzindo arquivos como:

php5-fpm.log.00
php5-fpm.log.01
php5-fpm.log.02
...

cortar os zeros à esquerda do sufixo seria uma tarefa simples e poderia ser feito facilmente manualmente. Mas aqui está o meu problema: Como eu poderia reverter o sufixo, para que o arquivo com o sufixo mais alto se tornasse o de menor valor?

    
por mr.alex 20.09.2015 / 16:50

2 respostas

2

Para cortar o comprimento do sufixo (eliminar zeros), você pode fazer o seguinte:

$ split --suffix-length=1 -C 10m -d php5-fpm.log php5-fpm.log.
Infelizmente não há nenhum parâmetro que você poderia passar para dividir, o que inverteria os sufixos, mas você poderia usar tac ao invés de cat, e inverter o arquivo e passá-lo para dividir o comando, algo como:

$ tac php5-fpm.log | split --suffix-length=1 -C 10m -d - php5-fpm.log.

Agora tudo que você precisa fazer é inverter os arquivos divididos mais uma vez (e comprimir enquanto estamos nisso):)

$ for i in php5-fpm.log.*; do tac $i | gzip > $i.gz; rm -f $i; done

EDITAR:

Existe outra abordagem que alguém pode tomar para este, caso você não queira usar o tac:

split --suffix-length=1 -C 10m -d php5-fpm.log php5-fpm.
export COUNT=$(expr $(ls php5-fpm.[0-9] | wc -l) - 1)
for i in $(seq 0 $COUNT); do
    mv php5-fpm.$i php5-fpm.log.$(expr $COUNT - $i);
done

O primeiro comando dividirá o arquivo de log grande em arquivos menores:     php5-fpm.0     php5-fpm.1     php5-fpm.2     ... mais tarde, você conta o número de arquivos e apenas inverte números com poder de avaliação da expressão bash: expr (1).

    
por 20.09.2015 / 17:11
0

Você pode conseguir a parte de renomeação com este script de shell rápido e sujo:

#!/bin/bash
for x in php5-fpm.log.*
do
  max=${x/php5-fpm.log./}
done
mkdir renamed-files || exit 1
for x in php5-fpm.log.*
do
  num=${x/php5-fpm.log./}
  let num=max-num+1
  mv $x renamed-files/php5-fpm.log.$num
done
mv renamed-files/* .
rmdir renamed-files

Observe os arquivos renomeados sendo coletados em um subdiretório para evitar colisões de nomes com arquivos que ainda não foram renomeados.

Observe também a saída após o mkdir, caso o subdiretório renamed-files não possa ser criado, por exemplo, porque existe um arquivo com esse nome. Continuar o script pode ter efeitos indesejáveis irreversíveis nesse caso.

    
por 20.09.2015 / 17:31