接続が切断された後、SSH経由でrsyncを再開しますか?


45

rsyncを使用してsshで大量のデータ(> 80 GB)を転送する必要があります。すべてが正常に機能していますが、バックアップデータの送信元であるDSL接続は最大3分間、24時間に1回切断されます(プロバイダーの切り替えはオプションではありません)。

方法:

  1. 接続がバックアップされたときに転送を自動的に再開しますか?

  2. 誤って同時に2つのrsyncコマンドが実行されていないことを確認しますか?


戻りコードを確認できませんか?成功while ./run_script; do echo "Retrying..."; done; echo "Done."run_scriptたら必ず返品0してください。
ケレックSB

可能性のある重複serverfault.com/q/98745
タニウス

ここにいくつかの有用な情報があります-パスワードの問題を繰り返し尋ねるのを回避する1つの方法は、 'sshpass'コマンドを使用することです。その他のapt-getでインストールする通常、このニーズ
レイチェル・サンダース

回答:


52

以下が役立つはずです。

#!/bin/bash

while [ 1 ]
do
    rsync -avz --partial source dest
    if [ "$?" = "0" ] ; then
        echo "rsync completed normally"
        exit
    else
        echo "Rsync failure. Backing off and retrying..."
        sleep 180
    fi
done

接続が切断されると、rsyncはゼロ以外の終了コードで終了します。このスクリプトは単純にrsyncを再実行し続け、同期が正常に完了するまで続行します。


1
ありがとう = "0"]ではない場合:if ["$?" == "0"](比較演算子)?

1
いいえ、bashの「=」は文字列の平等です(混乱させる多くの要素の1つです!)
Peter

6
==は別名= = D
bbaja42

8
ああ、知って良かった。バッシュは決して私を驚かせる/怖がらせることをやめることはありません:-P-
ピーター

2
パーティーに遅れて、しかし後世のために:A)ただ使用:if rsync -avz --partial source dest; その後... B)算術展開に二重括弧を使用する場合に整数値を比較する場合:if(($?= 0))then;
user18402

7

これはPeterの答えとほぼ同じですが、ユーザーはどのリモートファイルが必要で、どこに保存するかを選択できます(sshでrsyncを実行することもできます)。USERとHOSTをそれぞれユーザー名とホストに置き換えます。

#!/ bin / bash
echo -e「完全な(エスケープされた)ファイルパスを入力してください:」
read -rパス
echo "パス:$ path"
echo -e "宛先を入力してください:"
読み取り-r dst
echo "宛先:$ dst"
一方[1]
行う
    rsync --progress --partial --append -vz -e ssh "USER @ HOST:$ path" $ dst
    if ["$?" = "0"]; それから
        echo "rsyncが正常に完了しました"
        出口
    他に
        echo "rsyncが失敗しました。1分後に再試行します..."
        寝る60
    fi
やった

ここで使用するrsyncオプションを使用すると、転送中の進行状況の統計、予期しない障害が発生した場合の部分ファイルの保存、再開時に部分的に完了したファイルへの追加が可能になります。-vオプションは冗長性を高め、-zオプションは圧縮を有効にします(低速接続には適していますが、両端でより多くのCPUパワーが必要です)。-eオプションを使用すると、この転送をsshで実行できます(暗号化は常に適切です)。

注:これは、sshで公開キーログインを有効にしている場合にのみ使用してください。そうしないと、再起動時にパスワードの入力を求められます(スクリプトのすべての機能を停止します)。


1
これが元の質問のベストアンサーです。:それはまた、間違った答えと重複に適用されますserverfault.com/questions/98745/...
rickfoosusa

5

スーパーバイザーデーモン(プロセスコントロールマネージャー)は、次のような同様の構成で、両側のrsa証明書を作成した後に非常にうまく機能します:(/ etc / supervisor / Supervisord.confは、Debianベースのシステムの構成ファイルパスです)

[program:rsync-remoteserver]
command=rsync -avz --progress root@server.com:/destination /backup-path
stdout_logfile=/out-log-path  
stderr_logfile=/errlogpath

1

@Peterの答えは非常に便利なようですが、私にとっては--updateオプションを使用することが重要でした。接続が再開された後、--updatersyncが最初からすべて同期しようとしていませんでした。で--update、すでに存在するファイルはスキップされます。

rsync --partial --update --progress -r [SOURCE] [DESTINATION]


2
--updateすでに存在するファイルをスキップします...ターゲットに完全にコピーされていないファイルを含めます。ほとんどのユースケースに反すると思います。
デュラム

@durumは、少なくともrsync 3.1.2には当てはまりません。転送を中断した後、同じファイルで正常に動作することがわかります。sshでrsyncを使用しましたrsync --partial --update file1 remotehost:file1。コマンドはでした。15%を転送した後、転送を中断しました(kill -KILL)。
filiprem
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.