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?
gunzip -c
schreibt die Ausgabe an stdout ... vielleicht ist es das, wonach Sie suchen? Das Original bleibt unverändert.Antworten:
Abgesehen vom Ende der Datei können Sie die unkomprimierten Daten mit
zcat
(odergzip -dc
, odergunzip -c
) anzeigen :oder
oder
gzip
fü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 derlog.gz
Datei.Sie können das unkomprimierte Protokoll auch mit speichern
... aber das wäre albern, da es offensichtlich einen Grund gibt, warum Sie die Ausgabe überhaupt komprimieren.
quelle
gunzip < log.gz
stattzcat log.gz
für Systeme, bei denenzcat
nur in.Z
Dateien funktioniert .Wenn ich das richtig verstehe, möchten Sie so etwas wie
tail -f
mit der noch wachsenden gzip-Datei machen: Ich habe gztool entwickelt, das das (unter anderem) kann:und es wird kontinuierlich an die Konsole ausgegeben und wartet auf neue Daten, wenn dies erforderlich ist.
Beachten Sie, dass
gztool
(log.gzi
in diesem Fall) auch eine Indexdatei erstellt wird, die zukünftige Schwänze oder andere zufällige Zugriffe auf die gzip-Datengztool
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 verwenden-W
, um ihn nicht zu erstellen.quelle
Sie können versuchen, die Datei zu teilen und jede Datei zu gzipen: https://stackoverflow.com/a/2016918/3090950
Könnten Sie den Befehl im ausführlichen Modus ausführen? Dadurch erhalten Sie weitere Informationen.
quelle