web-dev-qa-db-ja.com

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

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

方法:

  1. 接続が復旧したら自動的に転送を再開しますか?

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

48
Andreas

以下が役立つはずです。

#!/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を再実行し続けるため、同期が正常に完了するまで続行されます。

56
Peter

これは、ピーターの答えとほとんど同じですが、ユーザーが希望するリモートファイルと、それを保存する場所(およびsshを介してrsyncを実行する)のオプションをユーザーに提供します。 USERとHostをそれぞれユーザー名とホストに置き換えます。

#!/ bin/bash 
 echo -e "完全な(エスケープされた)ファイルパスを入力してください:" 
 read -r path 
 echo "パス:$ path "
 echo -e"宛先を入力してください: "
 read -r dst 
 echo"宛先:$ dst "
 while [1] 
 do 
 rsync --progress --partial --append -vz -e ssh "USER @ Host:$ path" $ dst 
 if ["$?" = "0"];次に、
 echo "rsyncが正常に完了しました" 
 exit 
 else 
 echo "rsync failure。Retrying in a minute ..." 
 sleep 60 
 fi 
完了

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

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

9
KernelSanders

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

[program:rsync-remoteserver]
command=rsync -avz --progress [email protected]:/destination /backup-path
stdout_logfile=/out-log-path  
stderr_logfile=/errlogpath
5
ugurarpaci

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

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

1
YasiuMaster