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 dondezcat
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.
gunzip -c
escribe la salida en stdout … tal vez eso ' s lo que estas buscando? Mantiene el original sin cambios.