Tengo un trabajo en un sistema por lotes que se ejecuta durante mucho tiempo y produce toneladas de resultados. Tanto en realidad 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, lo haría quisiera investigar el resultado del trabajo mientras aún se está ejecutando. Entonces hago esto:

gunzip log.gz 

Esto es muy largo, 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á compilando.

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 con gzip. 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 esto:

gzip: log.gz: unexpected end of file 

Después de esto, el registro extraído El archivo se elimina, ya que gzip cree que los datos extraídos dañados 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 de que me permita conservar el archivo «dañado»?

Comentarios

Respuesta

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 

gzip hará 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.gz archivo.

También puede almacenar el registro sin comprimir con

zcat log.gz > log 

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

Comentarios

  • Consulte gunzip < log.gz en lugar de para sistemas donde zcat solo funciona en .Z archivos.

Responder

Si entiendo correctamente, le gustaría hacer algo como tail -f con el gzip que sigue creciendo file: «He desarrollado gztool que puede hacer eso (entre otras cosas):

$ gztool -T log.gz 

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

Tenga en cuenta que gztool también creará un archivo de índice (log.gzi en este caso) que hará que las colas futuras u otros accesos aleatorios a los datos de gzip sean gztool casi instantáneos. Si no desea crear un índice (aunque tenga un tamaño de 0.3% / gzip y no aumente el tiempo de procesamiento) puede usar -W para no crearlo.

Respuesta

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

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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *