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 derzcat
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.
gunzip -c
skriver utdata til stdout … kanskje at ' s hva du leter etter? Den holder originalen uendret.