Ik heb een taak op een batch-systeem dat extreem lang duurt en tonnen uitvoer produceert. Zoveel zelfs dat ik de standaarduitvoer door gzip moet leiden om te voorkomen dat het batchknooppunt zijn werkgebied vult en vervolgens crasht.

longscript | gzip -9 > log.gz 

Nu zou ik willen willen graag de output van de job onderzoeken terwijl deze nog bezig is. Dus ik doe dit:

gunzip log.gz 

Dit duurt erg lang, aangezien het een enorm bestand is (meerdere GB). Ik kan zien dat het uitvoerbestand wordt gemaakt terwijl het wordt uitgevoerd en kan ernaar kijken terwijl het wordt gebouwd.

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

Uiteindelijk komt gzip echter aan het einde van het gzipped-bestand. Aangezien de taak nog steeds actief is en gzip nog steeds bezig is met het schrijven van het bestand, is er nog geen goede voettekst, dus dit gebeurt:

gzip: log.gz: unexpected end of file 

Hierna wordt het uitgepakte logboek bestand is verwijderd, omdat gzip denkt dat de beschadigde geëxtraheerde gegevens geen nut voor mij hebben. Ik ben het er echter niet mee eens – zelfs als de laatste paar regels gecodeerd zijn, is de uitvoer nog steeds zeer interessant voor mij.

Hoe kan ik gzip overtuigen om me het “beschadigde” bestand te laten behouden?

Reacties

Answer

Afgezien van het einde van het bestand, kunt u de niet-gecomprimeerde gegevens zien met zcat (of gzip -dc, of gunzip -c):

zcat log.gz | tail 

of

zcat log.gz | less 

of

zless log.gz 

gzip zal om voor de hand liggende redenen bufferen (het moet de gegevens in brokken comprimeren), dus hoewel het programma mogelijk enkele gegevens heeft uitgevoerd, bevinden die gegevens zich mogelijk nog niet in de log.gz bestand.

U kunt het ongecomprimeerde logboek ook opslaan met

zcat log.gz > log 

… maar dat zou dwaas zijn aangezien er duidelijk een reden waarom u de uitvoer in de eerste plaats comprimeert.

Opmerkingen

  • Zie gunzip < log.gz in plaats van voor systemen waar zcat alleen werkt in .Z bestanden.

Antwoord

Als ik het goed begrijp, “zou je zoiets als tail -f willen doen met de nog steeds groeiende gzip file: I “heb gztool ontwikkeld die dat (onder andere) kan doen:

$ gztool -T log.gz 

en het zal continu naar de console sturen, wachtend op nieuwe gegevens wanneer dat nodig is.

Merk op dat gztool ook een indexbestand zal aanmaken (log.gzi in dit geval) die toekomstige staarten of andere willekeurige toegangen tot de gzip-gegevens met gztool vrijwel onmiddellijk zal maken. Als u geen index wilt maken (hoewel deze 0,3% / gzip-grootte heeft en de verwerkingstijd niet verlengt), kunt u -W gebruiken om deze niet te maken.

Antwoord

Je kunt proberen het bestand te splitsen en elk ervan te gzippen: https://stackoverflow.com/a/2016918/3090950

Hoe dan ook, zou je het commando in uitgebreide modus kunnen uitvoeren? Dit geeft u meer informatie.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *