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, hvorzcat
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.
gunzip -c
skriver output til stdout … måske at ' s, hvad du leder efter? Det holder originalen uændret.