gzip: fine imprevista del file con - come leggere comunque il file


9

Ho un lavoro su un sistema batch che funziona estremamente a lungo e produce tonnellate di output. Tanto effettivamente che devo reindirizzare l'output standard tramite gzip per evitare che il nodo batch riempia la sua area di lavoro e successivamente si blocchi.

longscript | gzip -9 > log.gz

Ora, vorrei esaminare l'output del lavoro mentre è ancora in esecuzione. Quindi faccio questo:

gunzip log.gz

Funziona molto a lungo, in quanto è un file enorme (diversi GB). Posso vedere il file di output creato mentre è in esecuzione e posso guardarlo mentre viene creato.

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

Tuttavia, alla fine, gzip rileva la fine del file gzipped. Poiché il lavoro è ancora in esecuzione e gzip sta ancora scrivendo il file, non esiste ancora un piè di pagina adeguato, quindi ciò accade:

gzip: log.gz: unexpected end of file

Successivamente, il file di registro estratto viene eliminato, poiché gzip ritiene che i dati estratti danneggiati non mi siano utili. Tuttavia, non sono d'accordo - anche se le ultime due righe sono confuse, l'output è ancora molto interessante per me.

Come posso convincere gzip a farmi conservare il file "corrotto"?


gunzip -cscrive l'output su stdout ... forse è quello che stai cercando? Mantiene inalterato l'originale.
bretonica,

Risposte:


5

A parte la fine del file, sarai in grado di vedere i dati non compressi con zcat(o gzip -dc, o gunzip -c):

zcat log.gz | tail

o

zcat log.gz | less

o

zless log.gz

gzipeseguirà il buffering per ovvi motivi (deve comprimere i dati in blocchi), quindi anche se il programma potrebbe aver emesso alcuni dati, tali dati potrebbero non essere ancora nel log.gzfile.

È inoltre possibile archiviare il registro non compresso con

zcat log.gz > log

... ma sarebbe sciocco poiché c'è ovviamente un motivo per cui comprimere l'output in primo luogo.


1
Vedere gunzip < log.gzinvece zcat log.gzper i sistemi in cui zcatfunziona solo nei .Zfile.
Stéphane Chazelas,

1

Se ho capito bene, ti piacerebbe fare qualcosa di simile tail -fcon il file gzip ancora in crescita: ho sviluppato gztool che può farlo (tra le altre cose):

$ gztool -T log.gz

e verrà emesso per console continuamente, in attesa di nuovi dati quando è necessario.

Si noti che gztoolcreerà anche un file indice ( log.gziin questo caso) che renderà le code future o altri accessi casuali ai dati gzip con gztoolquasi istantaneo. Se non si desidera creare un indice (anche se ha una dimensione dello 0,3% / gzip e non aumenta il tempo di elaborazione) è possibile utilizzare -Wper non crearlo.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.