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 cuizcat
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.
gunzip -c
scrive loutput su stdout … forse questo ' s quello che stai cercando? Mantiene loriginale invariato.