파일이 성공적으로 전송 될 때까지 rsync를 반복적으로 호출하는 방법


27

신뢰할 수없는 원격 서버에서 파일을 동기화하려고하는데 연결이 "무작위로"실패하는 경향이 있습니다.

rsync : 연결이 예기치 않게 종료되었습니다

Rsync는 --partial과 함께 호출되므로 파일이 완전히 전송 될 때까지 루프에서 rsync를 호출 할 수 있기를 원합니다. rsync에게 다시 시도하도록 지시하는 플래그가없는 것 같습니다.

스크립트를 작성하는 가장 좋은 방법은 무엇입니까? bash for 루프?


1
아래의 답변이 도움이 되긴하지만 실패한 이유를 찾아 중지시키는 것이 좋습니다. 서버, 클라이언트 및 네트워크를 사이에서 제어한다고 가정하므로 다양한 장소에서 tcpdump를 실행하여 닫히는 방법을 확인할 수 있습니다. 방화벽이나 VPN 장치 중 하나가 연결을 닫고 있습니까?
MarkR

연결하는 서버가 공유 호스트이므로 루트 액세스 권한이 없습니다. 나는 그것이 왜 닫히고 있는지 조사 할 수 있지만, 지금은 다시 시도하게되어 기쁘다. 어쨌든 고마워요
Bruno Lopes

나는 rsync가 실제로 재시도 할 수있는 능력이 없다는 것을 알게되어 충격을 받았다!
Michael

rsync --partial --append에는 재시도, 수동 또는 반환 코드 확인 스크립트가 있습니다. 중복 : superuser.com/questions/302842/…
rickfoosusa

답변:


29

하나의 동기화로 모든 것을 동기화하는 경우 rsync가 성공적인 리턴 코드를 제공 할 때까지 루프에서 rsync를 호출하십시오.

다음과 같은 것 :

RC=1 
while [[ $RC -ne 0 ]]
do
   rsync -a .....   
   RC=$?
done

이것은 리턴 코드가 0이 될 때까지 rsync를 호출하여 반복됩니다.


28
당신은 그냥 쓸 수 있습니다! rsync -a ....; do sleep 5; 완료
Justin

1
예를 들어 cron을 통해 실행하려고하면 동시성 문제가 발생할 수 있습니다.
Keiran Holloway

3
일시적이지 않은 오류 (예 : 파일 읽기 또는 쓰기 권한 오류)가있는 경우 무한 루프로 바뀝니다. 특정 네트워크 오류 RC=12; while [[ $RC -eq 12 || $RC -eq 30 ]](또는 네트워크 드롭에서보고있는 종료 상태) 와 같은 rsync의 종료 상태를 확인하는 것이 좋습니다 .
Gordon Davisson

1
나는 이것을 (완전히) 무인으로 돌리지 않고 무한 루프와 동시성은 큰 문제가되지 않으므로 감사합니다.
Bruno Lopes

2
자동 인증을 사용할 수 없거나 적합하지 않은 경우 모든 유형의 쉘 기반 루프에서 비밀번호를 묻기 때문에 rsync에는이 기능이 내장되어 있지 않습니다.
Michael


1

sshpass와 함께 모두 제거

while ! sshpass -p 'xxxx' rsync --partial --append-verify --progress -a -e 'ssh -p 22' /source/ remoteuser@1.1.1.1:/dest/; do sleep 5;done
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.