web-dev-qa-db-ja.com

gzipはアトミックですか?

gzipはアトミックですか?

ファイルのgzip圧縮の最中にgzipプロセスを停止するとどうなりますか?

アトミックでない場合、およびgzip *.txtプロセスですでにCtrl + Cを押した場合、どのようにして安全に再開できますか?

(再開方法に興味があるだけでなく、gzipが具体的にアトミックかどうかも知りたいです。)

11
Vendetta

Gzipはアトミックですか?

いいえ。圧縮ファイルを作成してから、圧縮されていない元のファイルを削除します。

具体的には、ファイルは圧縮されませんin sitであり、ファイルが圧縮されている間、

  • 圧縮されたターゲットは不完全です
  • 部分的に圧縮されたファイルとそのソースの両方がファイルシステムに存在します。

ファイルのgzip圧縮の最中にgzipプロセスを停止するとどうなりますか?

キャッチ可能なシグナル(gzipからSIGINTプロセスを停止した場合 Ctrl Cたとえば)、部分的に作成されたファイルをクリーンアップします。そうしないと、停止した場所によっては、手つかずのオリジナルと一緒に部分的に圧縮されたファイルになる可能性があります。

アトミックでない場合、すでにgzip * .txtプロセスでCtrl + Cを押した場合、安全に再開するにはどうすればよいですか?

部分的に圧縮されたバージョンを削除し(まだ存在する場合)、gzipを再起動します。

28
roaima

これはアトミックではありません(UnixファイルシステムAPIは、複数のファイルに影響を与えるアトミック操作を実行する方法を実際には提供していません)が、isフェイルセーフです。圧縮ファイルは新しいファイルであり、元のファイルを上書きせず、圧縮ファイルの作成が完了するまで元のファイルを削除しません(十分なディスク領域がない場合、これにより実際に問題が発生する可能性があります両方のファイル)。

エラーが発生したり、圧縮を中断したりしても、元のファイルは変更されません。通常、部分的に圧縮されたファイルは削除されます。

途中で再開する方法はなく、最初からやり直すだけです。

15
Barmar

gzipは新しい.gzファイルを作成し、それに圧縮されたコンテンツを入力してから、元のファイルを削除するため、そのことを心配する必要はありません。したがって、途中でプロセスを停止しても、元のファイルには影響しません。

4
dr_

gzipによって既に正常に処理された.txtファイルは.txt.gz圧縮ファイルに置き換えられるため、gzip *.txtを安全に再実行できます-処理されていないファイルのみまだ圧縮されます。

Ctrl-Cを押したときにgzipによって処理されていたファイルは変更されません-afterが正常に圧縮されるまで、gzipはそれを置き換えません。

3
cas

いいえ、それは非常に非原子的です。これは、Webログのように、時々追加されるファイルをgzipする場合に大きな問題を引き起こす可能性があります。

Gzipは、(現在のタイムスタンプで).gzファイルを読み取り、作成し、元のファイルのタイムスタンプをコピーしてから、元のファイルを削除します。

特定の中断により、.txt.gzファイルのすぐ横に、未完成の.txtファイルが残ることがあります。これにより、データ整合性の問題が発生します。実際のファイルはどれですか。これは

  • 失敗したgzipにより、不完全/破損した.txt.gz?または
  • 失敗したgunzip、不完全な/切り捨てられた.txtファイルが残っていますか?または
  • ファイルは正常にtxt.gzにgzipで圧縮され、新規作成.txtファイルですか?

(これは、HTTPログディレクトリに移動してgzip *に移動すると最後に発生します)。

私は通常、これを手動で行った方が賢明だと思います。

幸い、gzipは通常シリアルで動作するため、この問題は1つのファイルでのみ発生します。 gzipを並列化することは良い考えではありません。CPUをより完全に使用しますが、ディスクをスラッシュして複数のファイルを一度に読み取らせ、すべてのgzipの速度を大幅に低下させます。一方、SSDまたはRAMdisk ...