Jai un travail sur un système de traitement par lots 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 bloquer par la suite.
longscript | gzip -9 > log.gz
Maintenant, je le ferais aiment étudier la sortie du travail pendant quil est toujours en cours dexécution. Donc je fais ceci:
gunzip log.gz
Cela fonctionne très longtemps, car il sagit dun fichier énorme (plusieurs Go). Je peux voir le fichier de sortie en cours de création pendant quil est en cours dexécution et le regarder pendant sa construction.
tail log > some-line-of-the-log-file tail log > some-other-line-of-the-log-file
Cependant, finalement, gzip rencontre la fin du fichier gzippé. Comme le travail est toujours en cours dexécution et que gzip est toujours en train décrire le fichier, il ny a pas encore de pied de page approprié, donc ceci se produit:
gzip: log.gz: unexpected end of file
Après cela, le journal extrait le fichier est supprimé, car gzip pense que les données extraites corrompues ne me sont daucune utilité. Cependant, je ne suis pas daccord – même si les deux dernières lignes sont brouillées, la sortie est toujours très intéressante pour moi.
Comment puis-je convaincre gzip de me laisser conserver le fichier « corrompu »?
Commentaires
Réponse
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
gzip
fera 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 des données, ces données peuvent ne pas encore être dans le log.gz
fichier.
Vous pouvez également stocker le journal non compressé avec
zcat log.gz > log
… mais ce serait idiot car il y a évidemment un raison pour laquelle vous compressez la sortie en premier lieu.
Commentaires
- Voir
gunzip < log.gz
au lieu de pour les systèmes oùzcat
ne fonctionne que dans les fichiers.Z
.
Réponse
Si je comprends bien, vous « aimeriez faire quelque chose comme tail -f
avec le gzip toujours en croissance file: Jai développé gztool qui peut faire cela (entre autres):
$ gztool -T log.gz
et il sera affiché en continu sur la console, en attendant de nouvelles données lorsque cela est nécessaire.
Notez que gztool
créera également un fichier dindex (log.gzi
dans ce cas) qui rendra les futures queues ou autres accès aléatoires aux données gzip avec gztool
presque instantanés. Si vous ne souhaitez pas créer dindex (même sil est de 0,3% / taille gzip et naugmente pas le temps de traitement), vous pouvez utiliser -W
pour ne pas le créer.
Réponse
Vous pouvez essayer de diviser le fichier et de gzip chacun deux: https://stackoverflow.com/a/2016918/3090950
Quoi quil en soit, pourriez-vous exécuter la commande en mode détaillé? Cela vous fournira plus dinformations.
gunzip -c
écrit la sortie sur stdout … peut-être que ' est ce que vous cherchez? Il garde loriginal inchangé.