Isso provavelmente ocorre porque, mesmo que você trunque o arquivo, o processo que está sendo gravado no arquivo continuará sendo gravado em qualquer offset que tenha sido enfim. Então, o que está acontecendo é que o logrotate trunca o arquivo, o tamanho é zero, o processo grava no arquivo novamente, continua no offset deixado de lado, e agora você tem um arquivo com bytes NULL até o ponto em que você o truncou mais o novo entradas gravadas no log.
od -c após truncado + crescimento súbito, gerou saída ao longo das linhas de:
0000000 0000000 %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre%
*
33255657600 %pre% C K B - s e r v e r [ h t t
33255657620 <more log output>
%pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre%
*
33255657600 %pre% C K B - s e r v e r [ h t t
33255657620 <more log output>
O que isto diz é do offset 0 ao 33255657600, o seu arquivo consiste em bytes nulos e, em seguida, em alguns dados legíveis. Chegar a esse estado não leva o mesmo tempo que seria necessário para realmente gravar todos esses bytes nulos. Os sistemas de arquivos ext {2,3,4} suportam algo chamado arquivos esparsos, portanto, se você procurar por uma região de um arquivo que não contém nada, essa região será considerada como contendo bytes nulos e não ocupará espaço no disco. Esses bytes nulos não serão realmente escritos, apenas assumidos como estando lá, portanto, o tempo que leva para ir de 0 a 3.5GB não leva muito tempo. (Você pode testar a quantidade de tempo que leva fazendo algo como dd if=${HOME}/.bashrc of=largefile.bin seek=3432343264 bs=1
, isso deve gerar um arquivo de mais de 3 GB em alguns milissegundos).
Se você executar ls -ls
em seus arquivos de registro depois de terem sido truncados e ter um crescimento súbito novamente, ele deverá informar um número no início da linha que representa o tamanho real (em blocos ocupados no disco), que provavelmente é ordens de grandeza menor que o tamanho relatado por apenas ls -l
.