Eu tenho um trabalho em um sistema em lote que é executado extremamente longo e produz toneladas de saída. Tanto que preciso canalizar a saída padrão por meio do gzip para evitar que o nó do lote preencha sua área de trabalho e, subsequentemente, trave.

longscript | gzip -9 > log.gz 

Agora, eu gostaria de gostaria de investigar a saída do trabalho enquanto ele ainda está em execução. Então, eu faço isso:

gunzip log.gz 

Isso é muito longo, pois é um arquivo enorme (vários GB). Posso ver o arquivo de saída sendo criado enquanto está sendo executado e posso vê-lo enquanto está sendo construído.

tail log > some-line-of-the-log-file tail log > some-other-line-of-the-log-file 

No entanto, em última análise, o gzip encontra o fim do arquivo compactado. Como o trabalho ainda está em execução e o gzip ainda está gravando o arquivo, ainda não há rodapé adequado, então isso acontece:

gzip: log.gz: unexpected end of file 

Depois disso, o log extraído O arquivo é excluído, pois o gzip pensa que os dados extraídos corrompidos são inúteis para mim. Eu, no entanto, discordo – mesmo que as últimas linhas estejam embaralhadas, a saída ainda é altamente interessante para mim.

Como posso convencer o gzip a me deixar manter o arquivo “corrompido”?

Comentários

Resposta

Além do final do arquivo, você poderá ver os dados descompactados com zcat (ou gzip -dc, ou gunzip -c):

zcat log.gz | tail 

ou

zcat log.gz | less 

ou

zless log.gz 

gzip fará o armazenamento em buffer por motivos óbvios (ele precisa compactar os dados em blocos), então, embora o programa possa ter gerado alguns dados, esses dados podem ainda não estar no log.gz arquivo.

Você também pode armazenar o registro descompactado com

zcat log.gz > log 

… mas isso seria bobo, pois obviamente há um razão pela qual você compactou a saída em primeiro lugar.

Comentários

  • Consulte gunzip < log.gz em vez de para sistemas em que zcat funciona apenas em .Z arquivos.

Resposta

Se bem entendi, você “gostaria de fazer algo como tail -f com o gzip ainda crescente arquivo: Eu desenvolvi o gztool que pode fazer isso (entre outras coisas):

$ gztool -T log.gz 

e a saída para o console continuamente, aguardando por novos dados quando for necessário.

Observe que gztool também criará um arquivo de índice (log.gzi neste caso) que tornará caudas futuras ou outros acessos aleatórios aos dados gzip com gztool quase instantâneo. Se você não quiser criar um índice (embora tenha 0,3% do tamanho / gzip e não aumente o tempo de processamento), pode usar -W para não criá-lo.

Resposta

Você pode tentar dividir o arquivo e compactar cada um deles: https://stackoverflow.com/a/2016918/3090950

De qualquer forma, você poderia executar o comando no modo detalhado? Isso fornecerá mais informações.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *