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


15

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

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


このような場合に何が起こるかを確認するには、この記事をお読みください:unix.stackexchange.com/questions/49299/...
セルジュ・

ありがとう、あなたが書いた良い投稿。しかし、私の質問はcp関連であり、一般的なlinux-file-handlingではありません。私は多分cpがファイルがまだ開いているかどうかをチェックし、そのファイルが閉じられるか何かになるまで待ちます。
蒸れた

いいえcp。ファイルが完全にアップロードされるまで待機しません。ネットワーク転送速度は、同じホスト内のある場所から別の場所にファイルをコピーするよりも低いと予想されるため、ある時点でcp現在のファイルの終わりに到達してコピーを停止します。あなたの問題の解決は簡単かもしれません:最初に、ユーザーは特別にマングルされたファイル名でファイルをアップロードします(例えば.(ドット文字)を前に付けます。転送が完了すると、ユーザーは元の名前に名前を変更します。.。で始まっていないファイルの場合
セルジュ

回答:


17

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


ありがとう、それは私が知りたかったことです!それを避ける簡単な方法はありますか?cpのマニュアルページを確認しましたが、何も使用できませんでした。
蒸れた

正確に何をする?開いているファイル以外のすべてのファイルをコピーするには?これを行う簡単な方法はないと思います(fuser+ を使用する独自のスクリプトを作成する以外にcp。このようなコピーは実際には非常に信頼性が低いでしょう。たとえば、テキストエディタで開かれたファイルはコピーしません。)
Krzysztofアダムスキー

@Stuffy、おそらくあなたのcronジョブで、開いているファイルをリストできますlsofか?その出力は、簡単に処理できるようになっています。cp書き込み用に(たとえば、のインスタンスによって)開かれているファイルをフィルタリングできます。
Wojtek Rzepala

@WojtekRzepala、これを見ていただきありがとうございます。たぶん私は、cronジョブによって実行されます小さなスクリプト書きます
ムッ

@Stuffy:fuserこのツールはすべてのファイルを表示しない可能性があるため、rootユーザーによって実行されない場合(もちろん同じ問題があります)、本当に信頼できない場合があることに注意してください。
レジストフアダムスキー

7

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

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

そのため、アップロードの完了後にファイルを別のディレクトリに移動するようにアップロードジョブを調整します。この別のディレクトリでcronジョブを指定します。


6

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

そのため-u、--updateのオプションcp

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

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

rsync同じ仕事をすることができます。例えば、rsync -av SOURCEDIR/ DESTDIR

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

詳細についてはman cpman rsyncを参照してください。


宛先フォルダ内の最近のエントリに依存することに注意してください。完全なファイルではない場合があります。
-dubiousjim
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.