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?

Kommentare

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 denen zcat 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.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.