Jeg har en jobb på et batch-system som går ekstremt lenge og gir massevis av utdata. Så mye faktisk at jeg må røre standardutgangen gjennom gzip for å hindre at batchnoden fyller arbeidsområdet og deretter krasjer.

longscript | gzip -9 > log.gz 

Nå vil jeg liker å undersøke utdataene fra jobben mens den fortsatt kjører. Så jeg gjør dette:

gunzip log.gz 

Dette går veldig lenge, da det er en enorm fil (flere GB). Jeg kan se utdatafilen som blir opprettet mens den kjø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 

Imidlertid møter gzip til slutt slutten av gzipped-filen. Siden jobben fremdeles kjører og gzip fortsatt skriver filen, er det ingen riktig bunntekst ennå, så dette skjer:

gzip: log.gz: unexpected end of file 

Etter dette, hentet den utpakkede loggen filen blir slettet, da gzip mener at de ødelagte ekstraherte dataene ikke nytter meg. Jeg er imidlertid uenig – selv om de siste par linjene er kryptert, er utdataene fortsatt veldig interessante for meg.

Hvordan kan jeg overbevise gzip om å la meg beholde den «ødelagte» filen?

Kommentarer

Svar

Bortsett fra slutten av filen, vil du kunne se de ukomprimerte dataene med zcat (eller gzip -dc, eller gunzip -c):

zcat log.gz | tail 

eller

zcat log.gz | less 

eller

zless log.gz 

gzip vil gjøre buffering av åpenbare grunner (det må komprimere dataene i biter), så selv om programmet kan ha sendt ut noen data, kan det hende at dataene ennå ikke er i log.gz fil.

Du kan også lagre den ukomprimerte loggen med

zcat log.gz > log 

… men det ville være dumt, siden det åpenbart er en grunnen til at du i utgangspunktet komprimerer utdataene.

Kommentarer

  • Se gunzip < log.gz i stedet for for systemer der zcat bare fungerer i .Z filer.

Svar

Hvis jeg forstår riktig, vil du gjøre noe sånt som tail -f med den fortsatt voksende gzip file: Jeg har utviklet gztool som kan gjøre det (blant annet):

$ gztool -T log.gz 

, og den sendes kontinuerlig til konsollen og venter på nye data når det er nødvendig.

Merk at gztool også vil opprette en indeksfil (log.gzi i dette tilfellet) som vil gjøre fremtidige haler eller annen tilfeldig tilgang til gzip-dataene med gztool nesten øyeblikkelig. Hvis du ikke vil lage en indeks (selv om den er 0,3% / gzip-størrelse og ikke øker behandlingstiden), kan du bruke -W til å ikke opprette den.

Svar

Du kan prøve å dele filen og gzip hver av den: https://stackoverflow.com/a/2016918/3090950

Kan du uansett kjøre kommandoen i detaljert modus? Dette vil gi deg mer informasjon.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *