Rsyncを使用してssh経由で大量のデータ(> 80 GB)を転送する必要があります。すべてが正常に機能していますが、バックアップデータの送信元であるDSL接続は、24時間ごとに最大3分間ドロップします(プロバイダーの切り替えはオプションではありません)。
方法:
接続が復旧したら自動的に転送を再開しますか?
誤って2つのrsyncコマンドが同時に実行されていないことを確認しますか?
以下が役立つはずです。
#!/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を再実行し続けるため、同期が正常に完了するまで続行されます。
これは、ピーターの答えとほとんど同じですが、ユーザーが希望するリモートファイルと、それを保存する場所(および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で公開鍵ログインが有効になっている場合にのみ使用してください。そうでない場合、再起動時にパスワードの入力を求められます(スクリプトのすべての機能が無効になります)。
スーパーバイザデーモン(プロセスコントロールマネージャ)は、両側の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
@Peterの回答は非常に役立つようですが、私にとっては--update
オプションを使用することが重要でした。接続が再開された後、--update
がなければ、rsyncは最初からすべてを同期しようとしました。 --update
を使用すると、すでに存在するファイルはスキップされます。
rsync --partial --update --progress -r [SOURCE] [DESTINATION]