我在一個批次系統上工作,該系統運行時間極長並產生大量輸出。實際上,我必須透過 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
不管怎樣,你能在詳細模式下執行指令嗎?這將為您提供更多資訊。