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

8

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?

carsten
quelle
gunzip -cschreibt die Ausgabe an stdout ... vielleicht ist es das, wonach Sie suchen? Das Original bleibt unverändert.
Bretonics

Antworten:

5

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

gzipführt aus offensichtlichen Gründen eine Pufferung durch (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 log.gzDatei.

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.

Kusalananda
quelle
1
Siehe gunzip < log.gzstatt zcat log.gzfür Systeme, bei denen zcatnur in .ZDateien funktioniert .
Stéphane Chazelas
1

Wenn ich das richtig verstehe, möchten Sie so etwas wie tail -fmit der noch wachsenden gzip-Datei machen: Ich habe gztool entwickelt, das 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( log.gziin diesem Fall) auch eine Indexdatei erstellt wird, die zukünftige Schwänze oder andere zufällige Zugriffe auf die gzip-Daten gztoolfast 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 verwenden -W, um ihn nicht zu erstellen.

circulosmeos
quelle