gzip: final inesperado de arquivo com - como ler o arquivo mesmo assim

9

Eu tenho um trabalho em um sistema em lotes que é extremamente longo e produz toneladas de saída. Tanto que, na verdade, tenho que canalizar a saída padrão através do gzip para impedir que o nó do lote preencha sua área de trabalho e, subsequentemente, falhe.

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). Eu posso ver o arquivo de saída sendo criado enquanto está em execução 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, finalmente, 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 há rodapé adequado; portanto, isso acontece:

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. Porém, eu discordo - mesmo que as duas últimas linhas sejam embaralhadas, a saída ainda é muito interessante para mim.

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

carsten
fonte
gunzip -cescreve saída para stdout ... talvez seja isso que você está procurando? Mantém o original inalterado.
bretonics

Respostas:

5

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

zcat log.gz | tail

ou

zcat log.gz | less

ou

zless log.gz

gzipfará buffer por razões óbvias (ele precisa compactar os dados em partes), portanto, mesmo que o programa tenha produzido alguns dados, esses dados ainda não podem estar no log.gzarquivo.

Você também pode armazenar o log não compactado com

zcat log.gz > log

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

Kusalananda
fonte
1
Veja em gunzip < log.gzvez de zcat log.gzsistemas onde zcatapenas funciona em .Zarquivos.
Stéphane Chazelas
1

Se eu entendi direito, você gostaria de fazer algo parecido tail -fcom o arquivo gzip que continua crescendo: desenvolvi o gztool que pode fazer isso (entre outras coisas):

$ gztool -T log.gz

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

Note que gztooltambém criará um arquivo de índice ( log.gzineste caso) que fará com que caudas futuras ou outros acessos aleatórios aos dados gzip sejam gztoolquase instantâneos. Se você não deseja criar um índice (mesmo que o tamanho seja de 0,3% / gzip e não aumente o tempo de processamento), use-o -Wpara não criá-lo.

circulosmeos
fonte