gzip: final inesperado del archivo con - cómo leer el archivo de todos modos

9

Tengo un trabajo en un sistema por lotes que se ejecuta extremadamente largo y produce toneladas de salida. Tanto es así que tengo que canalizar la salida estándar a través de gzip para evitar que el nodo por lotes llene su área de trabajo y luego se bloquee.

longscript | gzip -9 > log.gz

Ahora, me gustaría investigar el resultado del trabajo mientras aún se está ejecutando. Entonces hago esto:

gunzip log.gz

Esto dura mucho tiempo, ya que es un archivo enorme (varios GB). Puedo ver el archivo de salida que se crea mientras se está ejecutando y puedo verlo mientras se está construyendo.

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

Sin embargo, en última instancia, gzip encuentra el final del archivo comprimido. Dado que el trabajo aún se está ejecutando y gzip todavía está escribiendo el archivo, todavía no hay un pie de página adecuado, por lo que sucede esto:

gzip: log.gz: unexpected end of file

Después de esto, el archivo de registro extraído se elimina, ya que gzip piensa que los datos extraídos corruptos no me sirven. Sin embargo, no estoy de acuerdo, incluso si las últimas dos líneas están codificadas, la salida sigue siendo muy interesante para mí.

¿Cómo puedo convencer a gzip para que me permita mantener el archivo "dañado"?

Carsten
fuente
gunzip -cescribe la salida en stdout ... tal vez eso es lo que estás buscando? Mantiene el original sin cambios.
bretón

Respuestas:

5

Además del final del archivo, podrá ver los datos sin comprimir con zcat(o gzip -dc, o gunzip -c):

zcat log.gz | tail

o

zcat log.gz | less

o

zless log.gz

gziphará el almacenamiento en búfer por razones obvias (necesita comprimir los datos en fragmentos), por lo que, aunque el programa haya generado algunos datos, es posible que esos datos aún no estén en el log.gzarchivo.

También puede almacenar el registro sin comprimir con

zcat log.gz > log

... pero eso sería una tontería ya que obviamente hay una razón por la cual comprimir la salida en primer lugar.

Kusalananda
fuente
1
Ver en gunzip < log.gzlugar de zcat log.gzsistemas donde zcatsolo funciona en .Zarchivos.
Stéphane Chazelas
1

Si entiendo correctamente, le gustaría hacer algo como tail -fcon el archivo gzip que sigue creciendo: he desarrollado gztool que puede hacer eso (entre otras cosas):

$ gztool -T log.gz

y saldrá a la consola continuamente, esperando nuevos datos cuando sea necesario.

Tenga en cuenta que gztooltambién creará un archivo de índice ( log.gzien este caso) que hará colas futuras u otros accesos aleatorios a los datos de gzip de forma gztoolcasi instantánea. Si no desea crear un índice (aunque tenga un tamaño de 0.3% / gzip y no aumente el tiempo de procesamiento), puede usarlo -Wpara no crearlo.

circulosmeos
fuente