cat / dev / null esvaziou meu arquivo de log, mas o tamanho não mudou

2

Sou muito novo no Unix. Usando o Solaris 10, enfrentei a questão abaixo.

Existe um arquivo de log grande com tamanho 9.5G. Eu tentei esvaziar o arquivo usando o comando abaixo.

# cat /dev/null file_log.txt

Ao fazer isso, recuperei espaço no sistema de arquivos, mas o tamanho do arquivo ainda é o mesmo e está aumentando. Eu percebi que um processo ainda está sendo executado no arquivo de log.

Existe uma maneira de corrigir o tamanho do arquivo? Isso vai afetar meu sistema de arquivos?

    
por user78960 28.07.2014 / 20:17

3 respostas

15

Supondo que você quis dizer

cat /dev/null > file_log.txt

a resposta é que o processo que tem o arquivo aberto para escrita o fez sem O_APPEND , ou definiu o offset no arquivo arbitrariamente, caso em que um arquivo esparso é criado. Este é um arquivo que contém "buracos", ou seja, o sistema "sabe" que existem grandes regiões com zeros, que não são realmente gravados no disco. É por isso que du e ls discordam - du analisa o uso real do disco, enquanto ls usa simplesmente stat() para extrair o atributo de tamanho de arquivo.

Solução: reinicie o processo. Se possível, reescreva a parte em que o arquivo está aberto para usar O_APPEND (ou modo a ao usar fopen() )

    
por 28.07.2014 / 23:46
10

cat /dev/null é um no op, pois não produz exatamente nada. cp /dev/null file é igualmente inútil.

Uma maneira mais simples de anular o conteúdo de um arquivo é redirecionar o comando null para ele dessa maneira:

: > file

ou mesmo, com a maioria dos shells, use apenas um redirecionamento sem especificar nenhum comando:

> file  

O fato de o tamanho relatado por ls ainda ser alto é apenas devido ao processo de escrita, que busca a ideia esperada de qual deve ser o final do arquivo antes de escrever. Porque não há "nada" antes do ponto de busca, isso não deveria doer. O único risco seria que você queira fazer backups ou cópias do arquivo afetado usando uma ferramenta de reconhecimento de arquivo não esparsa.

Observe que reiniciar o processo de gravação não "recuperará" o espaço, pois o arquivo permanecerá "holey".

Se você realmente quer que o tamanho do arquivo reportado seja zerado, você precisa parar (matar) o processo de escrita antes de apagar o arquivo.

    
por 29.07.2014 / 01:50
2

cat /dev/null file_log.txt

Isso só fez o gato ler /dev/null e ler imediatamente file_log.txt e enviar o resultado para stdout , sua tela. Isso não excluirá nada.

Se você quiser testar, use cat /dev/null non_existent_file e verá erros.

A maneira correta de truncar um arquivo é usar redirecionadores de shell ou qualquer tipo de editor para remover as linhas. O que você pretendia fazer era:

cat /dev/null > file_log.txt

que conta para o primeiro método.

    
por 28.07.2014 / 20:51