gzipはアトミックですか?


11

あるgzip原子の?

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

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

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



4
「安全に再開するにはどうすればよいですか?」_...のCTRL+Z代わりに使用CTRL+Cし、中断されたジョブを強制終了または再開します(番号n[- [n]+ Stopped-- gzip ...] で応答すると、同じ方法でwith %nまたはwith fgまたはwith bg...で再開できます)あなたはそれを殺すことができますkill %n)。
Hastur

圧縮大きな圧縮しながらファイルは、Ctrl-Cを、そして何が起こるかを参照してください。
ロンジョン

いいえ。ext4…sarcasmの滴下を除き、mvのみがアトミックです。しかし、少なくとも、しばらく前にデフォルトのマウントオプションを修正しました。
ミラビロス

回答:


28

gzipはアトミックですか?

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

具体的には、in situでファイル圧縮せず、ファイルの圧縮中に一定の期間があります。

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

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

gzipキャッチ可能なシグナル(SIGINTfrom Ctrl Cなど)でプロセスを停止すると、部分的に作成されたファイルがクリーンアップされます。そうしないと、停止した場所に応じて、未処理の元のファイルと一緒に部分的に圧縮されたファイルが作成される場合があります。

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

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


5
第2の処理がされたときの動作を終了それがいない場合、停止、およびのみが非扱う信号のために起こる(ないため^ C - > SIGINT又はSIGTERMれるgzip出力ファイルを削除するシグナルハンドラをインストールします)。
モスビー

1
@mosvyそうです。私はそれを見たことがありません。ありがとう
roaima

1
オリジナルが削除されているため、gzip圧縮されたファイルを削除しないように細心の注意を払っています。gzipが不規則に強制終了される場合、通常は1つのファイル、通常は最後のファイルです。
ハーパー-

@ハーパーはい。gzip途中の流れを止めると、常に小さなレース状態になります。またはgzip、ターゲットファイルを上書きするように常に指示することができます。これにより、ほとんどのクリーンアップの問題が回避されます。
ロアイマ

15

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

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

途中で再開する方法はありません。最初からやり直すだけです。


これにより、アトミックなマルチファイル操作をどのように実装できるかを考えさせられます。SQLトランザクションのようなものですか?
ヴァルはモニカを復活させる

1
@val約30年前、私はMultics / GCOSの後続として新しいOSを設計していたチームに所属し、データベースのようなファイルシステムがそのアイデアの一部でした。しかし、プロジェクトはそれほど遠くまでは行きませんでした。
Barmar

彼らはNTFSトランザクションを削除しましたが、複雑にする価値はないようです。名前の変更は最もアトミックな操作であり(同じファイルシステム上にあり、posixセマンティクスがある場合)、tempからfinalの名前に(close / fsyncの後で)名前を変更すると、圧縮されていないファイルが少なくとも完全になります。あなたは(自分自身の部分的故障モードを持っている)パイプを使用してこれらの問題を回避することができます
eckes

@eckes圧縮ファイルを閉じた後に元のファイルを削除する限り、アトミックな名前変更は必要ありません。オリジナルがなくなった場合は、圧縮ファイルが完全であることを確認できます。元のファイル(などsed -i)を置き換える操作には、アトミックな名前変更が必要です。
Barmar

@Barmarターゲットファイルの存在によってのみトリガーする場合(多くのディレクトリポーリングワークフローで実行されます)、ファイルが完全であることを確認してください。それをトリガーしないか、ソースの存在を確認して不完全なファイルを検出できる場合は、最終的な名前変更を行わなくても問題ありません。
eckes '25

4

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


3

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

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


0

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

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

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

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

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

あなたがそれをやっただけで何が起こったのかを正確に知っていない限り、私は一般的にこれを手で整理するのが賢明だと思う。

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


1
@roaima。確かに、私は昔私が働いていたある場所で昔使っていたスラングに頼っていました。共通の定義に修正します。
ハーパー-モニカを復活させる

1
反対票を投じる場合は、理由を説明するコメントを残してください。
JBentley
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.