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
gzip
fará 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.gz
arquivo.
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 -f
com 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 gztool
também criará um arquivo de índice ( log.gzi
neste caso) que fará acessos futuros ou outros acessos aleatórios aos dados gzip quase gztool
instantâ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 -W
para 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.