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

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

Tengo un trabajo en un sistema por lotes que funciona durante mucho tiempo y produce toneladas de producción. En realidad, es tanto 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 posteriormente falle.

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 ejecuta y puedo verlo mientras se crea.

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 aún está escribiendo el archivo, todavía no hay un pie de página adecuado, por lo que sucede lo siguiente:

gzip: log.gz: unexpected end of file

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

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

Respuesta1

Aparte 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

gzipalmacenará 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 se comprime la salida en primer lugar.

Respuesta2

Si entiendo correctamente, le gustaría hacer algo como tail -fcon el archivo gzip que aún crece: he desarrolladoherramientaque 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 realizará colas futuras u otros accesos aleatorios a los datos 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 utilizar la opción -Wde no crearlo.

Respuesta3

Puedes intentar dividir el archivo y comprimir cada uno de ellos:https://stackoverflow.com/a/2016918/3090950

De todos modos, ¿podrías ejecutar el comando en modo detallado? Esto le proporcionará más información.

información relacionada