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 care zcat 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.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *