rsyncが未完成のソースファイルを削除しないようにする


169

速度と質量の2つのマシンがあります。speedは高速インターネット接続を備えており、多くのファイルをディスクにダウンロードするクローラーを実行しています。質量には多くのディスク容量があります。ダウンロードが完了した後、ファイルを高速から大量に移動したいと思います。理想的には、次のように実行します。

$ rsync --remove-source-files speed:/var/crawldir .

しかし、rsyncがまだダウンロードが完了していないソースファイルのリンクを解除するのではないかと心配しています。(私はソースコードを見ましたが、これを防ぐものは何もありませんでした。)何か提案はありますか?

回答:


10

問題は、ファイルを削除するのではなく、完了する前にファイルを転送することです。

これがLinuxの場合、ファイルがプロセスAによって開かれ、プロセスBがファイルのリンクを解除する可能性があります。エラーはありませんが、もちろんAは時間を無駄にしています。したがって、rsyncがソースファイルを削除するという事実は問題ではありません。

問題は、rsyncがコピーされた後にのみソースファイルを削除することです。それがまだディスクに書き込まれている場合は、部分的なファイルになります。

これはどうですか:でmassリモートファイルシステムとしてマウントします(NFSは機能します)speed。次に、ファイルを直接Webクロールします。


9

ダウンロードプロセスをどの程度制御できますか?自分でロールする場合は、ダウンロード中のファイルを一時ディレクトリに移動するか、ダウンロードが完了するまで一時的な名前を付け、完了したら正しい名前にmvすることができます。サードパーティのソフトウェアを使用している場合は、それほど制御することはできませんが、一時ディレクトリの処理を実行できる場合があります。


3

Rsyncは特定のパターンに一致するファイルを除外できます。一時ディレクトリにファイルをダウンロードするように変更できない場合でも、ダウンロード中にファイルに別の名前を付ける規則がある場合があります(例:foo.downloadingという名前のファイルのダウンロード中foo)。このプロパティを使用してファイルを除外できます。コピーからダウンロードされたままです。


3

クロールプロセスを制御できる場合、または予測可能な出力がある場合、上記の解決策(完了するまで一時ファイルに保存し、完了したダウンロード場所に移動するか、「。downloading」という名前のファイルを無視します)うまくいくかもしれません。それがすべて制御できない場合は、「lsof $ filename」を実行して結果があるかどうかを確認することで、ファイルがプロセスによって開かれていないことを確認できます。明らかに誰もファイルを開いていない場合は、ファイルを移動しても安全です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.