O conteúdo de um arquivo é excluído apenas quando não há mais referência a ele. Uma referência a um arquivo pode ser uma entrada de diretório ou um identificador de arquivo aberto. Quando você remove um arquivo (por exemplo, com o comando rm
) que um processo ainda está aberto (aqui, o processo que está fazendo o log), o conteúdo do arquivo permanece até que o processo feche o arquivo.
A maneira mais simples de se livrar de logs antigos é
- Mover o arquivo para outro nome, por exemplo %código%
- Instrua o processo para reabrir seu arquivo de log. Se o processo não tiver como fazer isso, reinicie-o.
- Exclua o arquivo de log antigo agora fechado (
mv foo.log foo.log.old
).
O programa logrotate automatiza esse mecanismo e pode ser configurado para quantos dias de registros antigos devem ser mantidos . Ele também pode compactar logs antigos.
Para a etapa 2, se você não puder reiniciar o programa e não tiver como reabri-lo, tente forçá-lo a reabrir o arquivo de log com um depurador. No entanto, esteja ciente de que isso pode travar o programa se ele mantiver informações sobre o arquivo de log que agora se tornou inconsistente. Prova de conceito (cuidado com o fato de que muitas coisas podem dar errado com isso; em caso de dúvida, não faça isso):
gdb -n $pid -batch -x /dev/stdin <<EOF
call close(2)
call open("/path/to/foo.log", 1)
EOF
Um método bruto alternativo para liberar algum espaço em disco se você não se importa com nenhum dos logs é truncar o arquivo. O processo de registro continuará escrevendo na mesma posição no arquivo, mas o arquivo se tornará um arquivo esparso . Se você ler o arquivo desde o início, você obterá bytes nulos, mas esses bytes nulos ocuparão apenas alguns kB no disco.
dd if=/dev/null of=/path/to/foo.log