gzip: unerwartetes Dateiende mit - wie kann ich die Datei trotzdem lesen?

gzip: unerwartetes Dateiende mit - wie kann ich die Datei trotzdem lesen?

Ich habe einen Job auf einem Batch-System, der extrem lange läuft und Unmengen an Ausgabe produziert. Tatsächlich so viel, dass ich die Standardausgabe durch gzip leiten muss, um zu verhindern, dass der Batch-Knoten seinen Arbeitsbereich füllt und anschließend abstürzt.

longscript | gzip -9 > log.gz

Nun möchte ich die Ausgabe des Jobs untersuchen, während er noch ausgeführt wird. Also mache ich Folgendes:

gunzip log.gz

Dies dauert sehr lange, da es sich um eine riesige Datei (mehrere GB) handelt. Ich kann sehen, wie die Ausgabedatei erstellt wird, während sie ausgeführt wird, und kann sie während des Erstellens ansehen.

tail log
> some-line-of-the-log-file
tail log
> some-other-line-of-the-log-file

Letztendlich stößt gzip jedoch auf das Ende der gzip-komprimierten Datei. Da der Job noch läuft und gzip die Datei noch schreibt, gibt es noch keine richtige Fußzeile, daher passiert Folgendes:

gzip: log.gz: unexpected end of file

Danach wird die extrahierte Protokolldatei gelöscht, da gzip der Meinung ist, dass die beschädigten extrahierten Daten für mich nutzlos sind. Ich bin jedoch anderer Meinung – selbst wenn die letzten Zeilen durcheinander geraten, ist die Ausgabe für mich immer noch sehr interessant.

Wie kann ich gzip davon überzeugen, dass ich die „beschädigte“ Datei behalten darf?

Antwort1

Abgesehen vom Ende der Datei können Sie die unkomprimierten Daten mit zcat(oder gzip -dc, oder gunzip -c) sehen:

zcat log.gz | tail

oder

zcat log.gz | less

oder

zless log.gz

gzipführt aus offensichtlichen Gründen eine Pufferung durch (die Daten müssen in Blöcken komprimiert werden), sodass es sein kann, dass die Daten, obwohl das Programm sie ausgegeben hat, noch nicht in der log.gzDatei vorhanden sind.

Sie können das unkomprimierte Protokoll auch speichern mit

zcat log.gz > log

... aber das wäre unsinnig, da es offensichtlich einen Grund gibt, warum Sie die Ausgabe überhaupt komprimieren.

Antwort2

Wenn ich das richtig verstehe, möchtest Du tail -fmit der immer noch wachsenden gzip-Datei so etwas machen: Ich habegztooldie (unter anderem) Folgendes können:

$ gztool -T log.gz

Die Ausgabe erfolgt kontinuierlich an die Konsole, wobei bei Bedarf auf neue Daten gewartet wird.

Beachten Sie, dass gztool(in diesem Fall) auch eine Indexdatei erstellt wird log.gzi, die zukünftige Tails oder andere wahlfreie Zugriffe auf die GZIP-Daten nahezu gztoolaugenblicklich ermöglicht. Wenn Sie keinen Index erstellen möchten (auch wenn dieser 0,3 % der GZIP-Größe beträgt und die Verarbeitungszeit nicht verlängert), können Sie -Wihn nicht erstellen.

Antwort3

Sie können versuchen, die Datei aufzuteilen und jede Datei im GZIP-Format zu komprimieren:https://stackoverflow.com/a/2016918/3090950

Könnten Sie den Befehl trotzdem im ausführlichen Modus ausführen? Dadurch erhalten Sie weitere Informationen.

verwandte Informationen