Como esvaziar corretamente um arquivo

4

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

eu corro

 > file.log

Meu ls -lh diz que ainda é 3 GB

No entanto, o tamanho da pasta que contém esse arquivo é de 3 GB a menos. Estranho o suficiente, contando as linhas diz que não está vazio, e eu não posso abri-lo com vim (muito grande).

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

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

head -1 file.log > first_line.txt

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

Pergunta 1: Por que meu primeiro comando não está esvaziando o arquivo?

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

Obrigado,

EDIT depois dos comentários: o arquivo está sendo aberto e escrito por outros processos, continuamente.

Infelizmente eu não posso interferir com esses processos, então eu não posso parar temporariamente ou reiniciá-los

    
por Francesco C. 02.02.2016 / 15:00

2 respostas

3

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

use lsof file.log para saber qual processo está escrevendo para ele.

então

mv file.log old.file.log

reinicie o processo. (isso depende do processo).

em seguida, você poderá excluir old.file.log .

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

    
por 02.02.2016 / 15:52
2

Para (quase) esvaziar o arquivo, use o comando

echo "" > file.log

Ou, se o seu sistema operacional tiver,

truncate file.log --size 0

truncará para 0 bytes.

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

Você pode pegar uma amostra do arquivo usando o comando

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

O que levará os primeiros 200 bytes do arquivo. (Se você precisar de mais, aumente o parâmetro "bs" até 4096, se você precisar de mais 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 sei se responde às suas perguntas.

    
por 02.02.2016 / 21:22

Tags