it-swarm.com.de

gzip: unerwartetes Dateiende mit - wie man die Datei trotzdem liest

Ich habe einen Job in einem Batch-System, das extrem lange läuft und Tonnen von Output produziert. Eigentlich 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

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

gunzip log.gz

Dies läuft sehr lange, da es sich um eine riesige Datei handelt (mehrere GB). Ich kann sehen, dass die Ausgabedatei während der Ausführung erstellt wird, und sie während der Erstellung anzeigen.

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 komprimierten Datei. Da der Job noch ausgeführt wird und gzip die Datei noch schreibt, gibt es noch keine richtige Fußzeile. Dies geschieht also:

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 keinen Nutzen haben. Ich bin jedoch anderer Meinung - auch wenn die letzten Zeilen verschlüsselt sind, ist die Ausgabe für mich immer noch sehr interessant.

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

8
carsten

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

zcat log.gz | tail

oder

zcat log.gz | less

oder

zless log.gz

gzip puffert aus offensichtlichen Gründen (es müssen die Daten in Blöcken komprimiert werden). Obwohl das Programm möglicherweise einige Daten ausgegeben hat, befinden sich diese Daten möglicherweise noch nicht in der Datei log.gz.

Sie können das unkomprimierte Protokoll auch mit speichern

zcat log.gz > log

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

5
Kusalananda

Wenn ich das richtig verstehe, möchten Sie mit der noch wachsenden gzip-Datei so etwas wie tail -f Machen: Ich habe gztool entwickelt, was das (unter anderem) kann:

$ gztool -T log.gz

und es wird kontinuierlich an die Konsole ausgegeben und wartet auf neue Daten, wenn dies erforderlich ist.

Beachten Sie, dass gztool auch eine Indexdatei (in diesem Fall log.gzi) Erstellt, die zukünftige Schwänze oder andere zufällige Zugriffe auf die gzip-Daten mit gztool fast augenblicklich ermöglicht. Wenn Sie keinen Index erstellen möchten (obwohl er 0,3%/gzip-Größe hat und die Verarbeitungszeit nicht verlängert), können Sie ihn mit -W Nicht erstellen.

1
circulosmeos

Sie können versuchen, die Datei zu teilen und jede Datei zu gzipen: https://stackoverflow.com/a/2016918/309095

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

0
Neil