gzip: fim inesperado do arquivo com - como ler o arquivo mesmo assim

gzip: fim inesperado do arquivo com - como ler o arquivo mesmo assim

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

longscript | gzip -9 > log.gz

Agora, 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 dura muito tempo, pois é um arquivo enorme (vários GB). Posso ver o arquivo de saída sendo criado enquanto está em execução e posso observá-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 final do arquivo compactado. Como o trabalho ainda está em execução e o gzip ainda está gravando o arquivo, ainda não existe um rodapé adequado, então acontece o seguinte:

gzip: log.gz: unexpected end of file

Depois disso, o arquivo de log extraído é excluído, pois o gzip pensa que os dados extraídos corrompidos não têm utilidade para mim. Eu, no entanto, discordo - mesmo que as últimas linhas estejam embaralhadas, o resultado ainda é muito interessante para mim.

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

Responder1

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

gzipfará o buffer por motivos óbvios (ele precisa compactar os dados em partes); portanto, mesmo que o programa tenha gerado alguns dados, esses dados ainda podem não estar no log.gzarquivo.

Você também pode armazenar o log descompactado com

zcat log.gz > log

... mas isso seria bobagem, pois obviamente há uma razão pela qual você compacta a saída em primeiro lugar.

Responder2

Se bem entendi, você gostaria de fazer algo parecido tail -fcom o arquivo gzip ainda crescente: eu desenvolviferramenta gzque pode fazer isso (entre outras coisas):

$ gztool -T log.gz

e será enviado para o console continuamente, aguardando novos dados quando necessário.

Observe que gztooltambém criará um arquivo de índice ( log.gzineste caso) que fará acessos futuros ou outros acessos aleatórios aos dados gzip quase gztoolinstantâneos. Se você não deseja criar um índice (mesmo que ele tenha tamanho de 0,3%/gzip e não aumente o tempo de processamento), você pode usar -Wpara não criá-lo.

Responder3

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.

informação relacionada