gzip: fin de fichier inattendue avec - comment lire le fichier quand même

9

J'ai un travail sur un système batch qui fonctionne extrêmement longtemps et produit des tonnes de sortie. Tellement en fait que je dois diriger la sortie standard via gzip pour empêcher le nœud de lot de remplir sa zone de travail et de se planter par la suite.

longscript | gzip -9 > log.gz

Maintenant, je voudrais étudier la sortie du travail alors qu'il est toujours en cours d'exécution. Alors je fais ça:

gunzip log.gz

Cela fonctionne très longtemps, car il s'agit d'un fichier énorme (plusieurs Go). Je peux voir le fichier de sortie en cours de création et le regarder lors de sa construction.

tail log
> some-line-of-the-log-file
tail log
> some-other-line-of-the-log-file

Cependant, en fin de compte, gzip rencontre la fin du fichier gzippé. Étant donné que le travail est toujours en cours d'exécution et que gzip écrit toujours le fichier, il n'y a pas encore de pied de page approprié, donc cela se produit:

gzip: log.gz: unexpected end of file

Après cela, le fichier journal extrait est supprimé, car gzip pense que les données extraites corrompues ne sont d'aucune utilité pour moi. Cependant, je ne suis pas d'accord - même si les deux dernières lignes sont brouillées, la sortie est toujours très intéressante pour moi.

Comment convaincre gzip de me laisser conserver le fichier "corrompu"?

carsten
la source
gunzip -cécrit la sortie sur stdout ... c'est peut-être ce que vous recherchez? Il conserve l'original inchangé.
bretonics

Réponses:

5

En dehors de la toute fin du fichier, vous pourrez voir les données non compressées avec zcat(ou gzip -dc, ou gunzip -c):

zcat log.gz | tail

ou

zcat log.gz | less

ou

zless log.gz

gzipfera la mise en mémoire tampon pour des raisons évidentes (il doit compresser les données en morceaux), donc même si le programme peut avoir sorti certaines données, ces données peuvent ne pas encore être dans le log.gzfichier.

Vous pouvez également stocker le journal non compressé avec

zcat log.gz > log

... mais ce serait idiot car il y a évidemment une raison pour laquelle vous compressez la sortie en premier lieu.

Kusalananda
la source
1
Voir gunzip < log.gzau lieu de zcat log.gzpour les systèmes où zcatne fonctionne que dans les .Zfichiers.
Stéphane Chazelas
1

Si je comprends bien, vous aimeriez faire quelque chose comme tail -favec le fichier gzip toujours en croissance: j'ai développé gztool qui peut le faire (entre autres):

$ gztool -T log.gz

et il sortira sur la console en continu, en attendant de nouvelles données lorsque cela sera nécessaire.

Notez que gztoolcela créera également un fichier d'index ( log.gzidans ce cas) qui rendra les futures queues ou autres accès aléatoires aux données gzip gztoolpresque instantanés. Si vous ne souhaitez pas créer un index (même s'il est de 0,3% / taille gzip et n'augmente pas le temps de traitement), vous pouvez utiliser -Wpour ne pas le créer.

circulosmeos
la source