rsyncを使用してsshで大量のデータ(> 80 GB)を転送する必要があります。すべてが正常に機能していますが、バックアップデータの送信元であるDSL接続は最大3分間、24時間に1回切断されます(プロバイダーの切り替えはオプションではありません)。
方法:
接続がバックアップされたときに転送を自動的に再開しますか?
誤って同時に2つのrsyncコマンドが実行されていないことを確認しますか?
rsyncを使用してsshで大量のデータ(> 80 GB)を転送する必要があります。すべてが正常に機能していますが、バックアップデータの送信元であるDSL接続は最大3分間、24時間に1回切断されます(プロバイダーの切り替えはオプションではありません)。
方法:
接続がバックアップされたときに転送を自動的に再開しますか?
誤って同時に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を再実行し続け、同期が正常に完了するまで続行します。
これは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で公開キーログインを有効にしている場合にのみ使用してください。そうしないと、再起動時にパスワードの入力を求められます(スクリプトのすべての機能を停止します)。
スーパーバイザーデーモン(プロセスコントロールマネージャー)は、次のような同様の構成で、両側の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
@Peterの答えは非常に便利なようですが、私にとっては--update
オプションを使用することが重要でした。接続が再開された後、--update
rsyncが最初からすべて同期しようとしていませんでした。で--update
、すでに存在するファイルはスキップされます。
rsync --partial --update --progress -r [SOURCE] [DESTINATION]
--update
すでに存在するファイルをスキップします...ターゲットに完全にコピーされていないファイルを含めます。ほとんどのユースケースに反すると思います。
rsync --partial --update file1 remotehost:file1
。コマンドはでした。15%を転送した後、転送を中断しました(kill -KILL)。
while ./run_script; do echo "Retrying..."; done; echo "Done."
しrun_script
たら必ず返品0
してください。