非常に長く実行され、大量の出力を生成するバッチシステムでジョブがあります。実際には、バッチノードが作業領域を埋めてクラッシュしないように、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を説得するにはどうすればよいですか?
コメント
回答
ファイルの最後を除いて、zcat
(またはgzip -dc
、またはgunzip -c
):
zcat log.gz | tail
または
zcat log.gz | less
または
zless log.gz
gzip
は明らかな理由でバッファリングを行います(データをチャンクに圧縮する必要があります)。そのため、プログラムが一部のデータを出力したとしても、そのデータはまだlog.gz
にない可能性があります。ファイル。
非圧縮ログを
zcat log.gz > log
…で保存することもできますが、明らかにそもそも出力を圧縮する理由。
コメント
- 代わりに
gunzip < log.gz
を参照してください。 div id = “a15zcat
が.Z
ファイルでのみ機能するシステムの場合はd60b5bc “>
。
回答
正しく理解できれば、まだ成長しているgzipでtail -f
のようなことをしたいと思います。ファイル:私は(とりわけ)それを実行できる gztool を開発しました:
$ gztool -T log.gz
そしてそれは継続的にコンソールに出力され、必要なときに新しいデータを待ちます。
gztool
もインデックスファイル(log.gzi
この場合)これにより、gztool
を使用してgzipデータへの将来のテールまたはその他のランダムアクセスがほぼ瞬時に行われます。インデックスを作成したくない場合(0.3%/ gzipサイズで処理時間が長くならない場合でも)、-W
を使用してインデックスを作成しないでください。
回答
ファイルを分割して、それぞれをgzipで圧縮することができます: https://stackoverflow.com/a/2016918/3090950
とにかく、コマンドを冗長モードで実行できますか?これにより、より多くの情報が提供されます。
gunzip -c
は出力をstdoutに書き込みます…多分' sあなたが探しているものは?元のファイルを変更せずに保持します。