gzip:予期しないファイルの終わり - ファイルを読む方法

gzip:予期しないファイルの終わり - ファイルを読む方法

私は非常に長い時間実行され、多くの出力を生成するバッチシステムで作業しています。バッチノードがワークスペースでいっぱいになった後にクラッシュするのを防ぐには、実際にgzipを介してstdoutをパイプする必要があります。

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

続いてコンソールに出力され、必要に応じて新しいデータを待ちます。

gzipで圧縮されたデータへの将来のtailまたは他のランダムアクセスをほぼ即時に実行できるgztoolインデックスファイルも作成されます(log.gziこの場合)。gztoolインデックスを作成したくない場合(0.3%/ gzipサイズで処理時間が長くない場合でも)、-Wインデックスなしを使用できます。

答え3

ファイルを分割してgzipで圧縮できます。https://stackoverflow.com/a/2016918/3090950

とにかく、詳細情報表示モードでコマンドを実行できますか?これにより、より多くの情報が提供されます。

関連情報