Como esvaziar corretamente um arquivo

Como esvaziar corretamente um arquivo

Ok, estou tentando esvaziar um arquivo. É um arquivo de log de texto, que está sendo gravado continuamente. Meu ls -lh diz que tem 3 GB

eu corro

 > file.log

Meu ls -lh diz que ainda tem 3 GB

No entanto, o tamanho da pasta que contém este arquivo é 3 GB menor. Estranho, contar as linhas diz que não está vazio e não consigo abri-lo com o vim (muito grande).

Não tenho acesso de administrador, mas sou o proprietário do arquivo.

Tentei criar um novo arquivo apenas com a primeira linha para ver o que está acontecendo

head -1 file.log > first_line.txt

E o first_line.txt tem 3 GB. Este é realmente um comportamento estranho.

Pergunta 1: Por que meu primeiro comando não esvazia o arquivo?

Pergunta 2: Como posso esvaziar o arquivo sem excluí-lo?

Obrigado,

EDITAR após comentários: o arquivo está sendo aberto e gravado por outros processos, continuamente.

Infelizmente, não posso interferir nesses processos, por isso não posso encerrá-los ou reiniciá-los temporariamente

Responder1

seu arquivo está sendo mantido por um processo, você não pode excluí-lo.

use lsof file.logpara saber qual processo está gravando nele.

então

mv file.log old.file.log

reinicie o processo. (isso depende do processo).

a seguir, você poderá excluir old.file.log.

Se o ID do seu arquivo estiver listado, /etc/logrotate.d/*você pode emitir um comando logrotate.

Responder2

Para (quase) esvaziar o arquivo, use o comando

echo "" > file.log

Ou, se o seu sistema operacional tiver,

truncate file.log --size 0

Irá truncá-lo para 0 bytes.

Se o arquivo não tiver feeds de linha, é possível que o arquivo inteiro tenha 1 linha, explicando um arquivo de 3 GB.

Você pode pegar uma amostra do arquivo usando o comando como

dd if=file.log of=firstpart.txt count=1 bs=200

O que ocupará os primeiros 200 bytes do arquivo. (Se precisar de mais, aumente o parâmetro "bs" até 4096, se precisar de mais do que isso, use o parâmetro count, ou seja, para obter 8192 blocos, count=2 bs=4096)

O conselho do @Archemar é bom, mas não tenho certeza se responde às suas perguntas.

informação relacionada