169

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

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

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

4

4 に答える 4

10

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

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

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

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

于 2008-09-07T15:16:34.683 に答える
9

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

于 2008-09-07T15:03:16.447 に答える
3

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

于 2008-09-07T18:05:25.900 に答える
3

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

于 2008-09-18T14:53:24.910 に答える