Jag har ett jobb i ett batchsystem som kör extremt långt och ger massor av utdata. Så mycket faktiskt att jag måste leda standardutmatningen genom gzip för att förhindra att batchnoden fyller sitt arbetsområde och sedan kraschar.
longscript | gzip -9 > log.gz
Nu skulle jag gillar att undersöka resultatet av jobbet medan det fortfarande körs. Så jag gör det här:
gunzip log.gz
Detta går väldigt länge, eftersom det är en enorm fil (flera GB). Jag kan se att utdatafilen skapas medan den körs och kan titta på den medan den byggs.
tail log > some-line-of-the-log-file tail log > some-other-line-of-the-log-file
Men i slutändan möter gzip slutet av gzipped-filen. Eftersom jobbet fortfarande körs och gzip fortfarande skriver filen finns det ingen rätt sidfot ännu, så detta händer:
gzip: log.gz: unexpected end of file
Efter detta extraherade loggen filen raderas, eftersom gzip tycker att de skadade extraherade uppgifterna inte är till någon nytta för mig. Jag håller dock inte med – även om de sista raderna är krypterade är utdata fortfarande mycket intressant för mig.
Hur kan jag övertyga gzip att låta mig behålla den ”korrupta” filen?
Kommentarer
Svar
Förutom slutet av filen kommer du att kunna se de okomprimerade data med zcat
(eller gzip -dc
, eller gunzip -c
):
zcat log.gz | tail
eller
zcat log.gz | less
eller
zless log.gz
gzip
kommer att göra buffring av uppenbara skäl (det måste komprimera data i bitar), så även om programmet kan ha matat ut en del data, kanske dessa data ännu inte finns i log.gz
fil.
Du kan också lagra den okomprimerade loggen med
zcat log.gz > log
… men det skulle vara dumt eftersom det uppenbarligen är en anledningen till att du komprimerar utgången i första hand.
Kommentarer
- Se
gunzip < log.gz
istället för för system därzcat
endast fungerar i.Z
-filer.
Svar
Om jag förstår rätt vill du göra något som tail -f
med den fortfarande växande gzip file: Jag har utvecklat gztool som kan göra det (bland annat):
$ gztool -T log.gz
och den matas ut kontinuerligt och väntar på nya data när det är nödvändigt.
Observera att gztool
också skapar en indexfil (log.gzi
i detta fall) som gör framtida svansar eller andra slumpmässiga åtkomster till gzip-data med gztool
nästan omedelbar. Om du inte vill skapa ett index (även om det är 0,3% / gzip-storlek och inte ökar bearbetningstiden) kan du använda -W
för att inte skapa det.
Svar
Du kan försöka dela upp filen och gzip var och en av den: https://stackoverflow.com/a/2016918/3090950
Hur som helst, kan du köra kommandot i detaljläge? Detta ger dig mer information.
gunzip -c
skriver utdata till stdout … kanske att ' s vad du letar efter? Det håller originalet oförändrat.