2つの別々のディレクトリがあります。ユーザーはファイルを最初のファイルにロードします。 5分ごとに2番目のディレクトリにファイルをコピーするcronjobがバックグラウンドで実行されています。
ユーザーがアップロードを完了しておらず、cronjobがファイルをコピーした場合はどうなりますか?これら2つのディレクトリは異なるユーザーが所有し、cronjobはrootとして実行されます。
答え1
cp
開いたファイルを認識しません。したがって、最初のユーザーが大容量ファイルをアップロードし、cronjob(または他のプロセス)がファイルのコピーを開始すると、作成されたコンテンツのみがコピーされます。このように考えることができます。cp
ファイルが完全であるかどうかに関係なく、現在のディスクにあるものをコピーします。そうしないと、ログファイルなどをコピーできません。
答え2
cp
これらのファイルを開くことができる他のプログラムを認識しません。そこには魔法はありませんcp
。 Unixの設計は、説得力のある理由がない限り、ファイルに任意の種類のロック設定を意図的に避けます(強制的であるということは、カーネルがロックを要求することを意味します)。このトピックについては、以下を参照してください。出力をファイルにリダイレクトすると、ファイルにロックが適用されますか?
ファイルは生産者によって生成され、完了後に消費者が使用するのが一般的です。これを処理する一般的な方法は、生産者に消費者が見つからない一時ファイルを作成し、生産者が完了したら消費者が見つけることができる場所にファイルを移動することです。同じファイルシステム上でファイルを移動するのは原子的な操作です。ある時点で、ユーザーに関する限り、ファイルは存在しない状態から存在する状態に移動します。
したがって、アップロードが完了したら、ファイルを別のディレクトリに移動するようにアップロードジョブをスケジュールします。クローン操作がこの別のディレクトリを指していることを確認してください。
答え3
ディレクトリ同期操作を実行したいようです。
なぜなら-u、--更新オプションcp
ソースファイルがターゲットファイルよりも最新の場合、またはターゲットファイルが見つからない場合にのみコピー
cp -auv SOURCEDIR/* DESTDIR
したがって、たとえば、変更時間が変更されたファイルをコピーするcronjobを追加できます。これはDESTDIR
、アップロードが完了すると完全なコピーが作成されることを意味します。
rsync
同じことができます。たとえば、rsync -av SOURCEDIR/ DESTDIR
。
-aオプションを適用しても、一部の指定された属性(所有権など)はスーパーユーザーのみを保持できます。
詳細よりman cp
。man rsync