原子的ですかgzip
?
gzip
ファイルのgzip中にプロセスを停止するとどうなりますか?
アトミックでなくプロセスでCtrl + Cを押した場合、どのようにgzip *.txt
安全に回復できますか?
(どのように復元するかだけでなく、具体的gzip
にAtomicなのかも気になります。)
答え1
gzipはアトミックですか?
習慣。圧縮ファイルを作成し、圧縮されていない元のファイルを削除します。
特にファイルを圧縮しません。現場でそして、ファイルが圧縮される一定時間、
- 圧縮先が不完全です。
- 部分的に圧縮されたファイルとそのソースの両方がファイルシステムに存在します。
gzipでファイルを圧縮している間にgzipプロセスを停止するとどうなりますか?
gzip
キャプチャ可能な信号(SIGINT
fromなど)を使用してプロセスを停止すると、部分的に生成されたCtrl Cファイルが消去されます。そうしないと、停止したときに部分的に圧縮されたファイルと元のファイルが変更されずに終了する可能性があります。
アトミックでない場合、gzip *.txtプロセスでCtrl + Cを押した場合、どのように安全に回復できますか?
部分的に圧縮されたバージョン(まだ存在する場合)を削除して再起動しますgzip
。
答え2
アトミックではありませんが(UnixファイルシステムAPIは、実際には複数のファイルに影響を与えるアトミックアクションを実行する方法を提供しません)はい安全ではありません。圧縮ファイルは新しいファイルであるため、元のファイルを上書きせず、圧縮ファイルの作成が完了するまで元のファイルは削除されません(両方のファイルに十分なディスク容量がないと実際に問題が発生する可能性があります)。
エラーが発生した場合、または圧縮が中断された場合、元のファイルは変更されません。圧縮ファイルの一部は通常削除されます。
途中で回復する方法はなく、最初からやり直すことができます。
答え3
gzip
新しいファイルが作成され.gz
、圧縮された内容が含まれた後に元のファイルが削除されるため、それを心配する必要はありません。したがって、プロセスを途中で停止しても、ソースファイルは影響を受けません。
答え4
いいえ、これは非常に非原子的です。場合によっては、添付ファイル(Webログなど)をgzipに圧縮すると、大きな問題が発生する可能性があります。
Gzipは.gzファイルを読み取り(現在のタイムスタンプを含む)、作成し、元のファイルのタイムスタンプをコピーし、元のファイルを削除します。
一部の中断により、.txt.gz
隣に未完成のファイルが残っている可能性があります.txt
。これはデータの整合性について質問をします。実際のファイルは何ですか?これは
- gzipが失敗し、ファイルが不完全または破損しています
.txt.gz
。または - gunzipが失敗して不完全または切り捨てられたファイルが残りますか
.txt
?または - ファイルが正常にgzipに圧縮され
txt.gz
ました新しく作られた.txt
文書?
(これはHTTPログディレクトリに移動してに移動すると発生しますgzip *
。)
私は通常この問題を実行したばかりで、何が起こっているのかを正確に知らない限り、手動でこの問題を解決するのが賢明だと思います。
幸いなことに、gzipは通常シリアルで実行されるため、1つのファイルでのみこの問題が発生するはずです。並列gzipは良いアイデアではありません。 CPUをより多く使用しますが、ディスクを破壊して一度に複数のファイルを読み取ることができるため、すべてのgzip速度が大幅に遅くなります。一方、SSDやRAMディスクは...