Jeg har et job på et batchsystem, der kører ekstremt langt og producerer masser af output. Så meget faktisk, at jeg er nødt til at røre standardoutputtet gennem gzip for at forhindre batchnoden i at udfylde sit arbejdsområde og efterfølgende kollidere. kan lide at undersøge output fra jobbet, mens det stadig kører. Så jeg gør dette:

gunzip log.gz 

Dette kører meget længe, da det er en enorm fil (flere GB). Jeg kan se outputfilen oprettes, mens den kører, og kan se på den, mens den bygges.

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

I sidste ende møder gzip dog slutningen af gzipped-filen. Da jobbet stadig kører, og gzip stadig skriver filen, er der ingen ordentlig sidefod endnu, så dette sker:

gzip: log.gz: unexpected end of file 

Herefter er den udpakkede log filen slettes, da gzip mener, at de beskadigede udpakkede data ikke har nogen nytte for mig. Jeg er dog uenig – selvom de sidste par linjer krypteres, er outputen stadig meget interessant for mig.

Hvordan kan jeg overbevise gzip om at lade mig beholde den “ødelagte” fil?

Kommentarer

Svar

Bortset fra slutningen af filen vil du kunne se de ukomprimerede data med zcat (eller gzip -dc eller gunzip -c):

zcat log.gz | tail 

eller

zcat log.gz | less 

eller

zless log.gz 

gzip gør buffering af åbenlyse grunde (det er nødvendigt at komprimere dataene i bidder), så selvom programmet muligvis har udsendt nogle data, er disse data muligvis endnu ikke i log.gz fil.

Du kan også gemme den ukomprimerede log med

zcat log.gz > log 

… men det ville være fjollet, da der tydeligvis er en grunden til at du komprimerer outputtet i første omgang.

Kommentarer

  • Se gunzip < log.gz i stedet for til systemer, hvor zcat kun fungerer i .Z filer.

Svar

Hvis jeg forstår det rigtigt, vil du gerne gøre noget som tail -f med den stadig voksende gzip fil: Jeg har udviklet gztool som kan gøre det (blandt andet):

$ gztool -T log.gz 

og den sendes kontinuerligt til konsol og venter på nye data, når det er nødvendigt.

Bemærk at gztool også opretter en indeksfil (log.gzi i dette tilfælde), der gør fremtidige haler eller anden tilfældig adgang til gzip-data med gztool næsten øjeblikkelig. Hvis du ikke vil oprette et indeks (selvom det er 0,3% / gzip-størrelse og ikke øger behandlingstiden), kan du bruge -W til ikke at oprette det.

Svar

Du kan prøve at opdele filen og gzip hver af den: https://stackoverflow.com/a/2016918/3090950

Kan du alligevel køre kommandoen i detaljeret tilstand? Dette giver dig mere information.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *