gzip:予期しないファイルの終わり-とにかくファイルを読み取る方法


9

非常に長く実行され、大量の出力を生成するバッチシステムのジョブがあります。実際には、バッチノードが作業領域を埋め尽くしてクラッシュするのを防ぐために、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を説得するにはどうすればよいですか?


gunzip -c出力をstdoutに書き込みます...たぶんそれがあなたが探しているものですか?オリジナルは変更されません。
ブルトニクス

回答:


5

ファイルの最後以外に、zcat(またはgzip -dc、またはgunzip -c)を使用して非圧縮データを表示できます。

zcat log.gz | tail

または

zcat log.gz | less

または

zless log.gz

gzip明らかな理由でバッファリングを行います(データをチャンクに圧縮する必要があるため)。プログラムが一部のデータを出力したとしても、そのデータはまだlog.gzファイルにない可能性があります。

圧縮されていないログを保存することもできます

zcat log.gz > log

...しかし、最初に出力を圧縮する理由が明らかにあるので、それはばかげたことでしょう。


1
ファイルでのみ機能するシステムのgunzip < log.gz代わりにzcat log.gzを参照してください。zcat.Z
ステファンChazelas

1

私が正しく理解しているなら、あなたtail -fはまだ成長しているgzipファイルのようなことをしたいと思います:(特に)それを行うことができるgztoolを開発しました:

$ gztool -T log.gz

そして、それは継続的にコンソールに出力され、必要なときに新しいデータを待ちます。

gztoolはまたlog.gzigztoolほとんど瞬時にgzipデータへの将来の末尾またはその他のランダムアクセスを行うインデックスファイル(この場合)も作成することに注意してください。インデックスを作成したくない場合は(0.3%/ gzipサイズであり、処理時間は増加しません)、インデックスを作成しないよう-Wにできます。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.