Am un job pe un sistem batch care rulează extrem de mult și produce tone de ieșire. Atât de mult, încât trebuie să introduc ieșirea standard prin gzip pentru a împiedica nodul lot să-și umple zona de lucru și să se blocheze ulterior.
longscript | gzip -9 > log.gz
Acum, aș doriți să investigați rezultatul lucrării în timp ce acesta rulează încă. Așa că fac asta:
gunzip log.gz
Acest lucru rulează foarte mult, deoarece este un fișier imens (câțiva GB). Pot vedea că fișierul de ieșire este creat în timp ce rulează și îl pot privi în timp ce este construit.
tail log > some-line-of-the-log-file tail log > some-other-line-of-the-log-file
Cu toate acestea, în cele din urmă, gzip întâlnește sfârșitul a fișierului gzipped. Deoarece lucrarea este încă în curs de executare și gzip încă scrie fișierul, nu există încă un subsol adecvat, așa că se întâmplă acest lucru:
gzip: log.gz: unexpected end of file
După aceasta, jurnalul extras fișierul este șters, deoarece gzip consideră că datele extrase corupte nu-mi sunt de nici un folos. Cu toate acestea, nu sunt de acord – chiar dacă ultimele două rânduri sunt amestecate, rezultatul este încă foarte interesant pentru mine.
Cum pot convinge gzip să mă lase să păstrez fișierul „corupt”?
Comentarii
Răspuns
În afară de sfârșitul fișierului, veți putea vedea datele necomprimate cu zcat
(sau gzip -dc
sau gunzip -c
):
zcat log.gz | tail
sau
zcat log.gz | less
sau
zless log.gz
gzip
va face buffering din motive evidente (trebuie să comprime datele în bucăți), așa că, deși programul ar fi putut scoate unele date, este posibil ca datele să nu fie încă în log.gz
fișier.
Puteți, de asemenea, să stocați jurnalul necomprimat cu
zcat log.gz > log
… dar asta ar fi o prostie, deoarece evident că există un motiv pentru care comprimați rezultatul în primul rând.
Comentarii
- Consultați
gunzip < log.gz
în loc de pentru sistemele în carezcat
funcționează numai în fișiere.Z
.
Răspunde
Dacă înțeleg corect, „ți-ar plăcea să faci ceva de genul tail -f
cu gzip încă în creștere fișier: am „dezvoltat gztool care poate face acest lucru (printre altele):
$ gztool -T log.gz
și va ieși pentru a consola continuu, așteptând date noi atunci când este necesar.
Rețineți că gztool
va crea și un fișier index (log.gzi
în acest caz) care va face viitoare cozi sau alte accesări aleatorii la datele gzip cu gztool
aproape instantanee. Dacă nu doriți să creați un index (chiar dacă are o dimensiune de 0,3% / gzip și nu crește timpul de procesare), puteți utiliza -W
pentru a nu-l crea.
Răspuns
Puteți încerca să împărțiți fișierul și să gzipați fiecare dintre acestea: https://stackoverflow.com/a/2016918/3090950
Oricum, ați putea rula comanda în modul detaliat? Aceasta vă va oferi mai multe informații.
gunzip -c
scrie ieșirea în stdout … poate că ' ce cauți? Păstrează originalul neschimbat.