原子的にファイルを作成してコピーする良い戦略は何ですか?

原子的にファイルを作成してコピーする良い戦略は何ですか?

myfile定期的に再生成する必要があるファイルがあります。再生には数秒かかります。一方、生成された最後の(または2番目から最後まで)ファイルを定期的に読み取る必要があります。完全に生成されたファイルを読み取って読み始めると、完全に読み取ることができるようにする最善の方法は何ですか?

1つの可能な解決策は

  1. myfile実際に最後に生成されたファイルへのソフトリンクですmyfile.last
  2. 再生成は新しいファイルで行われます。myfile.new
  3. 再生後にmyfile.new移行されました。myfile.last

私が見た質問(答えがわからない)は次のとおりです。myfilemvが発生している間に他のスクリプトがコピーされた場合、それはcp正しく行われましたか?

別の考えられる解決策は、名前にタイムスタンプを持つファイルを生成することです。たとえばmyfile-2014-09-03_12:34、これは最後にmyfile生成されたファイルへのソフトリンクです。このリンクは、作成後に新しいファイルを指すように変更する必要があります。繰り返しますが、このようなことが起こる可能性はどのくらいですか?

cp myfile anotherfile

破損したファイルをコピーしますか?

答え1

同じファイルシステム内を移動する場合、mvこれはアトミックです。コンテンツのコピーではなく名前だけを変更することです。したがって、あなたの世代の最後のステップは次のとおりです。

mv myfile.new myfile.last

読み取りプロセスでは、常にファイルの古いバージョンまたは新しいバージョンが表示され、不完全な内容はまったく表示されません。

答え2

最初の提案ソリューションを簡素化できます。ファイルmyfile.newをに再構築し、mv名前をmyfile

あなたならどうでしょうか?書く myfile新しいデータの場合、非同期リーダーは破損した(または少なくとも不完全な)データを取得する可能性がありますが、すでに知っています。私はあなたが思いついた解決策が安全であると確信しています。別のプロセスが 12:38 にファイルの 12:34 バージョンを開くと、そのファイルは引き続きそのファイル12:39バージョンのファイルは、myfileもはやどのディレクトリにも表示されなくなっても、名前が変更された後に読みやすいように開きます。 2番目のケースでは、12:39ファイルを指すようにシンボリックリンクを変更しても、バージョン12:34がディレクトリに残るため、これはより明確です。

関連情報