web-dev-qa-db-ja.com

「cp」は開いているファイルをどのように処理しますか?

2つの別々のディレクトリがあります。ユーザーは最初にファイルをロードします。バックグラウンドで実行されているcronjobがあり、ファイルを5分ごとに2番目のディレクトリにコピーします。

ユーザーがアップロードを完了せず、cronjobがファイルをコピーした場合はどうなりますか? 2つのディレクトリは異なるユーザーが所有していることに注意してください。cronjobはrootとして実行されます。

15
Stuffy

cpは、開いているファイルを認識していません。したがって、最初のユーザーが大きなファイルをアップロードし、cronjob(またはその他のプロセス)がこのファイルのコピーを開始した場合、すでに書き込まれている量だけがコピーされます。このように考えることができます。cpは、ファイルが完全であるかどうかに関係なく、現在ディスク上にあるもののコピーを作成します。そうしないと、たとえばログファイルをコピーできません。

17

cpは、他のプログラムがファイルを開いている可能性があることを知りません。 cpには魔法はありません。 unixの設計では、説得力のある理由(強制的にカーネルがそれを必要とすることを意味する)がない限り、意図的にファイルにロックをかけないようにしています。このトピックについては、 出力をファイルにリダイレクトするとファイルにロックが適用されますか? を参照してください。

このような状況は、ファイルがプロデューサーによって作成され、完了するとコンシューマーによって使用される場合が一般的です。これを処理する通常の方法は、コンシューマーが検索しない一時ファイルをプロデューサーに書き込んでから、プロデューサーが完了したら、コンシューマーが見つけられる場所にファイルを移動します。 (同じファイルシステム上での)ファイルの移動はアトミック操作です。ある時点で、コンシューマーにとって、ファイルは存在しない状態から存在する状態に変わります。

アップロードが完了したら、ファイルを別のディレクトリに移動するようにアップロードジョブを準備してください。 cronジョブがこの別のディレクトリを指すようにします。

Dir syncジョブを実行したいようです。

-u、--updatecpオプション

sOURCEファイルが宛先ファイルよりも新しい場合、または宛先ファイルがない場合にのみコピーする

そのため、変更時間が変更されたファイルをコピーするcp -auv SOURCEDIR/* DESTDIRなどのcronjobを追加できます。つまり、アップロードが完了すると、DESTDIRは最終的に完全なコピーを取得します。

rsyncでも同じことができます。例:rsync -av SOURCEDIR/ DESTDIR

-aオプションが適用されますが、指定された一部の属性(所有権など)は、スーパーユーザーしか保持できません。

詳細については、man cpman rsyncをご覧ください。

6
Edw4rd