이동하고 싶은 공간이 약 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 싱크에 이미 존재하는 파일 업데이트 건너뛰기
연결이 중단되었습니다.
종료 코드가 0이 아닐 때 지속적으로 rsync를 호출하여 전송이 성공할 때까지 프로세스를 계속하도록 하여 연결 문제 퍼즐(불안정한 Wi-Fi 등)을 해결했습니다. (전원을 차단하지 않는 한 번개가 전력선에 닿거나 신호로 죽입니다)
while
네트워크 연결 끊김을 처리하기 위해 루프를 사용하고 있습니다 .
while [ 1 ]
do
# STUFF
done
while [ 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