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
gzip
almacenará 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 una razón por la cual se comprime la salida en primer lugar.
Respuesta2
Si entiendo correctamente, le gustaría hacer algo como tail -f
con 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 gztool
también creará un archivo de índice ( log.gzi
en este caso) que realizará colas futuras u otros accesos aleatorios a los datos gzip de forma gztool
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 utilizar la opción -W
de 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.