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 quezcat
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.
gunzip -c
grava a saída em stdout … talvez isso ' é o que você está procurando? Ele mantém o original inalterado.