myfile
定期的に再生成する必要があるファイルがあります。再生には数秒かかります。一方、生成された最後の(または2番目から最後まで)ファイルを定期的に読み取る必要があります。完全に生成されたファイルを読み取って読み始めると、完全に読み取ることができるようにする最善の方法は何ですか?
1つの可能な解決策は
myfile
実際に最後に生成されたファイルへのソフトリンクですmyfile.last
。- 再生成は新しいファイルで行われます。
myfile.new
- 再生後に
myfile.new
移行されました。myfile.last
私が見た質問(答えがわからない)は次のとおりです。myfile
mvが発生している間に他のスクリプトがコピーされた場合、それは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がディレクトリに残るため、これはより明確です。