Ho un lavoro su un sistema batch che funziona estremamente a lungo e produce tonnellate di output. Tanto in realtà che devo convogliare loutput standard tramite gzip per impedire al nodo batch di riempire la sua area di lavoro e successivamente di bloccarsi.

longscript | gzip -9 > log.gz 

Ora, lo farei desidera esaminare loutput del lavoro mentre è ancora in esecuzione. Quindi faccio questo:

gunzip log.gz 

Questo funziona molto a lungo, poiché è un file enorme (diversi GB). Riesco a vedere il file di output che viene creato mentre è in esecuzione e posso guardarlo mentre viene costruito.

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

Tuttavia, alla fine, gzip incontra la fine del file gzip. Poiché il lavoro è ancora in esecuzione e gzip sta ancora scrivendo il file, non esiste ancora un piè di pagina appropriato, quindi questo accade:

gzip: log.gz: unexpected end of file 

Dopo questo, il registro estratto il file viene cancellato, poiché gzip pensa che i dati estratti danneggiati non siano di alcuna utilità per me. Tuttavia, non sono daccordo: anche se le ultime due righe sono codificate, loutput è ancora molto interessante per me.

Come posso convincere gzip a lasciarmi mantenere il file “danneggiato”?

Commenti

Risposta

Oltre alla 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 

gzip eseguirà 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.gz file.

Puoi anche memorizzare il registro non compresso con

zcat log.gz > log 

… ma sarebbe sciocco dato che ovviamente cè un motivo per cui comprimi loutput in primo luogo.

Commenti

  • Vedi gunzip < log.gz invece di per i sistemi in cui zcat funziona solo nei file .Z.

Risposta

Se ho capito bene, “ti piacerebbe fare qualcosa come tail -f con gzip ancora in crescita file: ho sviluppato gztool che può farlo (tra le altre cose):

$ gztool -T log.gz 

e verrà visualizzato continuamente sulla console, in attesa di nuovi dati quando è necessario.

Nota che gztool creerà anche un file di indice (log.gzi in questo caso) che renderà le code future o altri accessi casuali ai dati gzip con gztool quasi istantaneo. Se non desideri creare un indice (anche se ha una dimensione dello 0,3% / gzip e non aumenta il tempo di elaborazione) puoi utilizzare -W per non crearlo.

Risposta

Puoi provare a dividere il file e comprimerlo tramite gzip: https://stackoverflow.com/a/2016918/3090950

Ad ogni modo, potresti eseguire il comando in modalità dettagliata? Questo ti fornirà maggiori informazioni.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *