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"?
gunzip -c
escribe la salida en stdout ... tal vez eso es lo que estás buscando? Mantiene el original sin cambios.Respuestas:
Además del final del archivo, podrá ver los datos sin comprimir con
zcat
(ogzip -dc
, ogunzip -c
):o
o
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 ellog.gz
archivo.También puede almacenar el registro sin comprimir con
... pero eso sería una tontería ya que obviamente hay una razón por la cual comprimir la salida en primer lugar.
fuente
gunzip < log.gz
lugar dezcat log.gz
sistemas dondezcat
solo funciona en.Z
archivos.Si entiendo correctamente, le gustaría hacer algo como
tail -f
con el archivo gzip que sigue creciendo: he desarrollado gztool que puede hacer eso (entre otras cosas):y saldrá 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á colas futuras u otros accesos aleatorios a los datos de gzip de formagztool
casi 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-W
para no crearlo.fuente
Puede 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.
fuente