私は非常に長い時間実行され、多くの出力を生成するバッチシステムで作業しています。バッチノードがワークスペースでいっぱいになった後にクラッシュするのを防ぐには、実際に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
とにかく、詳細情報表示モードでコマンドを実行できますか?これにより、より多くの情報が提供されます。