
移動したいスペースが約50GB程度あります。 LANに最適化されたTCP / IP(したがってタイトルにネットワークがある)を介してこれを行いたいと思います。私の問題は、時々接続が失われ、すべてのデータをターゲットに確実にインポートできないようです。私はこれが欲しい
- あきらめるのはとても簡単ではありません。
- 自動再試行を続けます(両方のシステムに電源があると仮定)。
私の方法はrsync
。
SOURCE=/path/to/music/ # slash excludes "music" dir
DESTINATION=/path/to/destination
rsync \
--archive \ # archive mode; equals -rlptgoD (no -H,-A,-X)
--compress \ # compress file data during the transfer
--progress \ # show progress during transfer
--partial \ # delete any partially transferred files after interrupt, on by default but I added it for kicks
--human-readable \ #output numbers in a human-readable format
"$SOURCE" \
"$DESTINATION" \
考慮すべき他のパラメータがありますか?
答え1
再同期パラメータ
rsync
私のパラメータは大丈夫だと思います。
接続が失敗した後に存在するファイルを処理するためにパラメーターを追加する必要がありました。 yesを選択し--ignore-existing
たり、--update
すでに作成された内容を再作成しないでください。まだどちらが良いのかはよくわかりませんが(おそらくご存知の方もいますが)この場合は--update
この記事を読んで選択しました。https://askubuntu.com/questions/399904/rsync-has-been-interrupted-copy-from-beginning
比較する:
- --update は受信機から最新のファイルをスキップします。
- --ignore-existing シンクに既に存在するファイル更新をスキップする
接続が中断されました。
終了コードがゼロでない場合は、rsyncを継続的に呼び出して転送が成功するまでプロセスを続行させることで、接続問題のパズル(不安定なWi-Fiなど)を修正しました。 (電源を遮断しない限り、雷が電力線に当たるか信号で死ぬ)
while
ネットワークの切断を処理するためにループを使用しています。
while [ 1 ]
do
# STUFF
done
while [ 1 ]
1つの注意:ctrl cなどの信号を割り込み(SIGINT)として使用することは、を呼び出さないと機能しませんbreak
。
if [ "$?" -gt 128 ] ; then break
その後、rsyncの終了コードを確認できます。 0 はすべてのファイルが移動されたことを意味します。
elif [ "$?" -eq 0 ] ; then exit
それ以外の場合、転送は完了しません。
else sleep 5
スクリプト例 sync-music.sh
rsyncスクリプトはSSHパスワードなしのキー認証を使用します。
#!/bin/bash
SOURCE="/path/to/Music/"
DESTINATION="[email protected]:/media/Music"
while [ 1 ]
do
rsync -e 'ssh -p22'\
--archive \
--compress \
--progress \
--partial \
--update \
--human-readable \
"$SOURCE" \
"$DESTINATION"
if [ "$?" -gt 128 ] ; then
echo "SIGINT detected. Breaking while loop and exiting."
break
elif [ "$?" -eq 0 ] ; then
echo "rsync completed normally"
exit
else
echo "rsync failure. reestablishing connection after 5 seconds"
sleep 5
fi
done