毎日マージする必要がある複数のログファイルがあります。それぞれは異なるサーバーによって提供されます。ファイルをそこに置く操作が時々中断され、ファイルが切り捨てられます。この場合、ファイルは次回実行時に別の名前で記録されます。したがって、次のログファイルのリストが生成されることがあります。
server-1-log.gz
(昨日のログファイル)server-1-log.1.gz
(今日のログファイルは転送中に中断され、切り捨てられました。)server-1-log.2.gz
(今日のログファイルは再送信され、そのまま残ります)server-2-log.gz
(昨日のログファイル)server-2-log.1.gz
(今日のログファイル)
すべてのログファイルは各行のタイムスタンプで始まるため、ソートと重複排除は非常に簡単です。次のコマンドを使用してこれらのファイルをマージしようとしました。
zcat *.gz | sort | uniq | gzip > /tmp/merged.gz
問題は、切り捨てられたログファイルが次のエラーを生成することですzcat
。
gzip: server-1-log.1.gz: 予期しないファイルの終わり
zcatでこのエラーが発生すると、他のファイルからすべてのデータを読み取ることなく完全に終了することがわかりました。ファイルの1つが破損しているため、良いファイルにあったデータが失われました。この問題をどのように解決できますか?
zcat
エラーが発生して終了しないようにできますか?マニュアルページには何も表示されません。- 呼び出す前に切り捨てられたgzipファイルを変更できますか
zcat
? - 他のストレス軽減ルーチンを使用できますか?
ベストアンサー1
私はあなたが使用しているスクリプトのgzip
バージョンを推測していますzcat
。単に実行されるgzip -dc
だけでエラーが発生した場合、エラーを無視して停止するように指示することはできません。
個々の破損したアーカイブに対する文書化された修正は、そのアーカイブを実行することであるため、zcat
そこではあまり役に立ちません。
ファイルを処理するには、ファイルを繰り返すか(ループまたは見つかったfor
ものxargs
と似たものを使用)、次のいずれかを使用できます。ジュティルズzcat
エラーが発生しても処理を続けるバージョンがあります。