gzip:意外的文件結尾 - 如何讀取文件

gzip:意外的文件結尾 - 如何讀取文件

我在一個批次系統上工作,該系統運行時間極長並產生大量輸出。實際上,我必須透過 gzip 透過管道傳輸標準輸出,以防止批次節點填滿其工作區域並隨後崩潰。

longscript | gzip -9 > log.gz

現在,我想調查作業仍在執行時的輸出。所以我這樣做:

gunzip log.gz

這個運行時間很長,因為它是一個巨大的檔案(幾個 GB)。我可以看到輸出檔案在運行時創建,並且可以在構建時查看它。

tail log
> some-line-of-the-log-file
tail log
> some-other-line-of-the-log-file

然而,最終,gzip 遇到了 gzip 壓縮檔案的結尾。由於作業仍在運行並且 gzip 仍在寫入文件,因此還沒有正確的頁腳,因此會發生這種情況:

gzip: log.gz: unexpected end of file

此後,提取的日誌檔案將被刪除,因為 gzip 認為損壞的提取資料對我沒有用處。然而,我不同意 - 即使最後幾行被打亂,輸出對我來說仍然非常有趣。

我怎麼能說服 gzip 讓我保留「損壞的」檔案?

答案1

除了檔案的最後部分之外,您還可以使用zcat(或gzip -dc, 或gunzip -c) 查看未壓縮的資料:

zcat log.gz | tail

或者

zcat log.gz | less

或者

zless log.gz

gzip出於明顯的原因會進行緩衝(它需要將數據壓縮為區塊),因此即使程式可能已經輸出了一些數據,但該數據可能尚未在檔案中log.gz

您也可以將未壓縮的日誌儲存為

zcat log.gz > log

……但這很愚蠢,因為顯然首先有一個壓縮輸出的原因。

答案2

如果我理解正確的話,您想要tail -f對仍在增長的 gzip 檔案執行類似的操作:我已經開發了格子工具它可以做到這一點(除其他外):

$ gztool -T log.gz

並且會不斷的輸出到控制台,需要的時候等待新的資料。

請注意,gztool還將建立一個索引檔案(log.gzi在本例中),該檔案將使將來對 gzip 資料進行尾部或其他隨機存取幾乎gztool是瞬時的。如果您不想建立索引(即使它是 0.3%/gzip 大小並且不會增加處理時間),您可以使用-W不建立索引。

答案3

您可以嘗試拆分文件並對其進行 gzip:https://stackoverflow.com/a/2016918/3090950

不管怎樣,你能在詳細模式下執行指令嗎?這將為您提供更多資訊。

相關內容