ファイルが正常に転送されるまでrsyncを繰り返し呼び出す方法


27

信頼できないリモートサーバーからのファイルを同期しようとしています。つまり、接続が「ランダムに」失敗する傾向があります。

rsync:接続が予期せず閉じられました

Rsyncは--partialで呼び出されるため、ファイルが完全に転送されるまでループでrsyncを呼び出すことができます。rsyncに再試行を指示するフラグはないようです。

スクリプトを作成する最良の方法は何でしょうか?ループのbash?


1
以下の回答は役に立ちますが、失敗の理由を見つけて停止させる方が良いでしょう。サーバー、クライアント、およびそれらの間のネットワークを制御することを想定しているため、さまざまな場所でtcpdumpを実行して、どのように閉じられたかを確認できます。おそらく、ファイアウォールまたはVPNデバイスの1つが接続を閉じていますか?
MarkR

接続先のサーバーは共有ホストであるため、ルートアクセス権がありません。なぜ閉鎖するのかを検討するかもしれませんが、今のところは再試行するだけで満足です。とにかくありがとう
ブルーノロペス

rsyncには実際に再試行する機能がないことを知ってショックを受けました!
マイケル

rsync --partial --appendには、手動で、または戻りコードをチェックするスクリプトで再試行する機能があります。重複:superuser.com/questions/302842/…–
rickfoosusa

回答:


29

1回の同期ですべてを同期する場合は、rsyncから正常な戻りコードが返されるまでループでrsyncを呼び出します。

何かのようなもの:

RC=1 
while [[ $RC -ne 0 ]]
do
   rsync -a .....   
   RC=$?
done

これは、戻りコード0が返されるまで、rsyncを呼び出してループします。サーバーにDOSを実行しないように、スリープを追加することができます。


28
あなたはしばらく書くことができます!rsync -a ....; do sleep 5; done
ジャスティン

1
これの使い方に注意してください。たとえば、cron経由で実行しようとすると、同時実行の問題が発生する可能性があります。
ケイランホロウェイ

3
非一時的なエラー(ファイルの読み取りまたは書き込み権限エラーなど)がある場合、これは無限ループに変わります。特定のネットワークエラーについて、rsyncの終了ステータスを確認することをお勧めしRC=12; while [[ $RC -eq 12 || $RC -eq 30 ]]ます(ネットワークドロップで表示される終了ステータスなど)。
ゴードンデイヴィソン

1
私はこれを(完全に)無人で実行していないので、無限ループと並行性はそれほど問題ではありません、ありがとう。
ブルーノロペス

2
自動認証が利用できない、または適切でない場合、あらゆる種類のシェルベースのループがパスワードを要求するため、rsyncにはこの機能が組み込まれていません
マイケル


1

sshpassですべてを浄化する

while ! sshpass -p 'xxxx' rsync --partial --append-verify --progress -a -e 'ssh -p 22' /source/ remoteuser@1.1.1.1:/dest/; do sleep 5;done
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.