web-dev-qa-db-ja.com

最も「堅牢」なリモートファイルコピーですか?

非常に不安定なインターネット接続でファイルをコピーするにはどうすればよいですか?

場合によっては接続が失われることもあれば、一方のマシンまたはもう一方のマシンのIPが変更されることもありますが、両方がダイナミックDNSによってキャッチされます。

どのツールまたはコマンドを提案しますか?

rsyncはdiffのみをコピーするのにかなり気の利いたものだと聞いたことがありますが、これは何度も何度も再起動するか、whileやcronjobに入れるかのいずれかの多くの作業を意味します。

私はもっ​​と簡単で誰にでもできる何かを望んでいました。

補遺:

それは、あるサイトから別のサイトに、5GBを超える非常に大きなファイルがいくつかあるディレクトリをいくつかコピーすることです。コピー後、両方がローカルで別の場所に移動されます。

ネットワーキングレベルでは何もできません。そのための知識がありません。

私はwgetを使用するためにWebサーバーをセットアップしたくありません。これは安全ではなく、遠回りのルートのようです。

私はすでにSSH接続を確立しており、rsyncが両方のマシンにすでにインストールされているため、rsyncを実行できます(rsyncデーモンを起動して実行することはできません)。

sshよりインテリジェントなrsyncを作成して、ラインが一時的に切断されたときに続行しようとするヒントはありますか?しかし、ssh接続が停止しても、rsyncは問題にはなりません。したがって、このようなもの( https://serverfault.com/questions/98745/ )はおそらく機能しません:

while ! rsync -a .... ; do sleep 5 ; done

何か案は?

どうもありがとう!

ゲイリー

6
Gary Czychi

OK、私は私の場合に解決策を見つけました。私は実際に提案されたwhile loopを使用しています。これは次のようになります。

while ! \
rsync -aiizP --append --stats . -e ssh [email protected]:./path/rfiles ; \
do now=$(date +"%T") ; echo · Error at $now · ; sleep 5 ; done

Whileループがないと、手動でrsyncを再起動する必要があります。今、それは魅力のように機能します。

興味深いのは、接続が切断されてからちょうど10分後、接続が再開されてから約9分後にエラーが発生することです。その間、ターミナルウィンドウでは何も起こりません。この10分のタイムアウトはどこから来るのでしょうか。

ご助力ありがとうございます。

ゲイリー

参考:これは私が受け取るタイムアウトエラーです(事後10分):

...
thedirectory/afile.ext
Read from remote Host myhost.com: Operation timed out
rsync: writefd_unbuffered failed to write 16385 bytes [sender]: Broken pipe (32)
rsync: connection unexpectedly closed (394 bytes received so far) [sender]
rsync error: unexplained error (code 255) at /SourceCache/rsync/rsync-40/rsync/io.c(452) [sender=2.6.9]
3
Gary Czychi

私は間違いなくrsyncを提案します。接続が中断される可能性があると思うときはいつでも、rsyncを使用してファイルをコピーします。コピーが失敗した場合、単純に再開できることはわかっています。

成功するまで自動的に再起動する必要がある場合、whileループに入れるのは簡単です。

3
Greg Hewgill

Rsyncの主な問題は、個別のファイルを続行できないことです。複雑なディレクトリ構造をコピーする場合は問題ありませんが、たとえば単一のDVDイメージをコピーする場合は、堅牢ではありません。

そのような場合、私はwgetを使用します。より正確に、

wget -c -t 0 -T 10 http://....

特に興味深いのは、20秒のタイムアウトです。これにより、1つのパケットが失われたためにツールが効果的にハング/フリーズするという一般的な問題が解決されます。

もちろん、ソース側にhttpサーバーが必要です。実用的でない場合は、

split

大きなファイルを小さなファイルに分割し、rsyncを使用できます。分割されたファイルは、後で簡単な猫で統一することができます。

もちろん、成功するまでループでもrsyncを実行できます。

while ! rsync ...; do echo next try; done

コメント後の拡張子

rsynccan-partial 国旗。 @GregHewgillありがとうございます! :-)

ファイルコピーツールのレベルでこの問題を解決しようとすると、rsyncはそれと同じくらい優れています。オプションを必ず使用してください-au、rsyncが同じファイルを複数回同期しようとしないようにします。中断される前に少なくともファイルリストを交換し、1つのファイルを完全に転送できる限り、Rsyncは進行します。それを保証できない場合、ネットワークレベルのツールなしでは問題が発生します。

これをネットワークレベルで解決する方が簡単(かつ自然)だと思います。信頼できないネットワーク接続の上に信頼できるネットワークトンネルを構築します。数年前、私はこの目的のために Rocks を使用しました。それはメンテナンスされておらず、最近コンパイルしたり使用したりはしていませんが、機能しない根本的な理由はありません。 このスペース を見てください。