Ich habe einen Job auf einem Batch-System, das extrem lange läuft und Tonnen von Ausgabe produziert. 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 würde ich Ich möchte 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.
gzip: log.gz: unexpected end of file
Danach das extrahierte Protokoll Datei wird gelöscht, da gzip der Meinung ist, dass die beschädigten extrahierten Daten für mich keinen Nutzen haben. Ich bin jedoch anderer Meinung – selbst 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? P. >
Kommentare
-
gunzip -c
schreibt die Ausgabe in stdout … möglicherweise ' s was suchst du? Das Original bleibt unverändert. - Verwandte Themen: Wie wird gzip angewiesen, die Originaldatei beizubehalten?
Antwort
Abgesehen vom Ende der Datei können Sie die unkomprimierten Daten mit zcat
(oder gzip -dc
oder gunzip -c
):
zcat log.gz | tail
oder
zcat log.gz | less
oder
zless log.gz
gzip
puffert aus offensichtlichen Gründen (es muss die Daten in Blöcken komprimieren). Obwohl das Programm möglicherweise einige Daten ausgegeben hat, befinden sich diese Daten möglicherweise noch nicht in der log.gz
Datei.
Sie können das unkomprimierte Protokoll auch mit
zcat log.gz > log
speichern … aber das wäre dumm, da es offensichtlich eine gibt Grund, warum Sie die Ausgabe überhaupt komprimieren.
Kommentare
- Siehe
gunzip < log.gz
anstelle von für Systeme, bei denenzcat
nur in.Z
-Dateien funktioniert.
Antwort
Wenn ich das richtig verstehe, möchten Sie etwas wie tail -f
mit dem noch wachsenden gzip tun Datei: Ich habe gztool entwickelt, das dies (unter anderem) kann:
$ gztool -T log.gz
und es wird kontinuierlich an die Konsole ausgegeben und wartet bei Bedarf auf neue Daten.
Beachten Sie, dass gztool
auch eine Indexdatei erstellt (log.gzi
in diesem Fall), wodurch zukünftige Schwänze oder andere zufällige Zugriffe auf die gzip-Daten mit gztool
fast augenblicklich ausgeführt werden. Wenn Sie keinen Index erstellen möchten (obwohl er 0,3% / gzip-Größe hat und die Verarbeitungszeit nicht verlängert), können Sie -W
verwenden, um ihn nicht zu erstellen.
Antwort
Sie können versuchen, die Datei zu teilen und jeweils zu gzipen: https://stackoverflow.com/a/2016918/3090950
Wie auch immer, können Sie den Befehl im ausführlichen Modus ausführen? Dadurch erhalten Sie weitere Informationen.