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är zcat 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.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *