コピー中にファイルが変更されるとどうなりますか?


19

fileA.big(900mb)というファイルをロケーションBからロケーションCにコピーするとどのような影響がありますか。そのcp操作中に、たとえばプロセス全体で35%の場合、fileA.bigに新しい情報が追加され、900MBから930MBに増加します。

最終コピーの結果は何ですか(つまり、locationCのfileA.big)。

コピーが約70%通過し、元のファイルは更新されたが、今回は400mbに切り捨てられた場合(つまり、コピーの進行が切り捨てポイントを超えている場合)、コピーの結果はどうなりますか?

ext3 / ext4ファイルシステム上のLinux OSを参照します。ボリュームシャドウマジックなどはありません。ライブcouchdbファイルをバックアップ用にコピーすることで好奇心が刺激されましたが、特定のユースケースよりも一般的なシナリオに関心がありました。


これを聞いてくれてありがとう。私の「知識」はほとんど推測でした...今まで。
シェパン

回答:


10

fileA.bigコピー中に拡張された場合、コピーには追加されたデータが含まれます。

ファイルが現在のコピーよりも短く切り捨てられた場合、コピーはその場所で中断され、コピー先のファイルには中断された時点までにコピーされたものが含まれます。


27

パトリックは多かれ少なかれそれを持っていますが、その理由は次のとおりです。UNIXでファイルをコピーする方法は次のように機能します。

  1. からいくつかの(さらに)バイトを読み取ろうとしますfileA
  2. ファイルの終わりにいる(または過ぎている)ためにバイトを取得できなかった場合、完了です。終了する。
  3. それ以外の場合は、バイトを書き込み、fileBステップ1にループバックします。

それを知ること、そしてそれがそれと同じくらい簡単であることを知ることは、私たちにいくつかのコーナーケースを見させます。

ファイルの終わりが見つかるとすぐに、コピーが完了します。したがって、コピー中にファイルが成長しているが、コピーするよりもゆっくりと成長しているとしましょう。コピープログラムは元のファイルサイズを超えて進みます。なぜなら、そこに到達するまでに、ファイルにはさらに多くのファイルがあるからです。しかし、いくつかの点で、それはファイルの末尾に追いつくと、それはもはやバイト読み取ることができないので、それが終わりだ知っている。そのため、ファイルがさらに大きくなろうとしても、すぐに終了します。

ファイルが切り捨てられた場合、コピープログラムは「うーん、ファイルの終わりを過ぎました!」と言います。終了します。

また、データベースプログラムなどによってファイルの一部がランダムに更新されている場合、データはすべて同時にコピーされるわけではないため、古いデータと新しいデータが混在したものになります。結果はおそらく破損したコピーになるため、ライブデータベースのコピーを作成することは一般に良い考えではありません。

(そうは言っても、私はCouchDBに精通していないので、この種の破損に耐えられるようにデータベースを設計することは可能です。しかし、絶対に確認するのが最善です。)


良い説明。ちなみに、これは常に、Windowsから既知の典型的なエラーメッセージを取得せずにUNIXライクなOSでこれが可能である理由に驚いています(「ファイルにアクセスできません-使用中のファイル」)それをプレイしながら。Unixでは、(驚くべきことに)-何の問題もありません。UNIXベースのOSは常にファイルのバックアップコピーで動作するため、これは実現可能だと思います。
構文エラー

1
実際、削除されたファイルを読み取ることができるのは、異なるUNIX機能から来ています。UNIXでは、ファイルとファイル名は異なるものです。ファイルを削除するとき、実際に実行しているのは、ファイルへの名前付き「リンク」を削除することです。プログラムがファイルを開くと、それもリンクとしてカウントされます。システムは、リンクが残っていない場合にのみファイル自体を削除します。
ジャンダー

それで、ファイルがコピーできるよりも速く成長した場合、cpは終了しませんか?ファイルへの書き込みはファイルへの書き込みが可能でなければならず、cpがファイルから読み取ることができる速度よりも速いため、私はそれがありそうもないことを理解しています。
ブラート
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.