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 waarzcat
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.
gunzip -c
schrijft uitvoer naar stdout … misschien is dat ' s wat je zoekt? Het blijft origineel ongewijzigd.