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
gzip
fü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.gz
Datei 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 -f
mit 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 gztool
augenblicklich 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 -W
ihn 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.