연결이 끊긴 후 SSH를 통해 rsync를 다시 시작 하시겠습니까?


45

rsync를 사용하여 ssh를 통해 많은 양의 데이터 (> 80GB)를 전송해야합니다. 모든 것이 잘 작동하지만 백업 데이터가 전송되는 DSL 연결은 24 시간마다 최대 3 분 동안 끊어집니다 (전환 공급자는 옵션이 아닙니다).

내가 어떻게 할:

  1. 연결이 백업 될 때 자동으로 전송을 다시 시작 하시겠습니까?

  2. 실수로 두 개의 rsync 명령이 동시에 실행되고 있지 않은지 확인하십시오.


리턴 코드를 확인할 수 없습니까? while ./run_script; do echo "Retrying..."; done; echo "Done."확인 run_script반환 0성공을.
Kerrek SB 2016

serverfault.com/q/98745의 가능한 복제본 .
tanius

여기에 유용한 정보가 있습니다-비밀번호 문제를 반복적으로 묻는 반복되는 한 가지 방법은 'sshpass'명령을 사용하는 것입니다. 일반적으로 이것은 apt-get 등으로 설치해야합니다.
Rachael Saunders

답변:


52

다음이 도움이 될 것입니다 :

#!/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는 0이 아닌 종료 코드로 종료됩니다. 이 스크립트는 단순히 rsync를 다시 실행하여 동기화가 정상적으로 완료 될 때까지 계속합니다.


1
고마워요, 지금 시도 중입니다 ...하지만 다음과 같이해야합니다 : if [ "$?" = "0"]이 아님 : if [ "$?" == "0"] (비교 연산자)?

1
아니요, bash에서 "="는 문자열 평등입니다 (혼란을 일으키는 많은 것들 중 하나라고 생각합니다!)
Peter

6
== = 대한 별칭입니다 : D
bbaja42

8
아, 알아서 반가워요. bash는 결코 나를 놀라게하거나 무섭게하지 않을 것이다 : -P
Peter

2
그러나 후손을 위해 파티에 늦게 : A) 단지 사용하십시오 : if rsync -avz --partial source dest; 그런 다음 ... B) 산술 확장에 이중 괄호를 사용하는 경우 정수 값을 비교하려면 if (($? = 0));
user18402

7

이것은 Peter의 대답과 거의 동일하지만 사용자가 원하는 원격 파일 및 저장하려는 위치 (ssh를 통한 rsync 수행) 옵션을 제공합니다. USER 및 HOST를 각각 사용자 이름 및 호스트로 바꾸십시오.

#! / bin / bash
echo -e "이스케이프 된 전체 파일 경로를 입력하십시오 :"
-r 경로 읽기
echo "경로 : $ path"
echo -e "대상을 입력하십시오 :"
-r dst 읽기
에코 "대상 : $ dst"
[1] 동안
하다
    rsync --progress --partial --append -vz -e ssh "USER @ HOST : $ path"$ dst
    [ "$?" = "0"]; 그때
        에코 "동기화가 정상적으로 완료되었습니다"
        출구
    그밖에
        echo "rsync failure. 잠시 후 다시 시도 중 ..."
        수면 60
    fi
끝난

여기에서 사용 된 rsync 옵션은 전송 중 진행률 통계, 예기치 않은 실패시 부분 파일 저장 및 재개시 부분적으로 완료된 파일에 추가하는 기능을 활성화합니다. -v 옵션은 상세도를 높이고 -z 옵션은 압축을 가능하게하며 (느린 연결에는 좋지만 양쪽 끝에 더 많은 CPU 전원이 필요함), -e 옵션을 사용하면 ssh를 통해이 전송을 수행 할 수 있습니다 (암호화는 항상 좋습니다).

참고 : ssh로 공개 키 로그인을 사용하도록 설정 한 경우에만 사용 하십시오. 그렇지 않으면 다시 시작할 때 암호를 묻습니다 (스크립트의 모든 기능이 종료 됨).


1
이것이 원래 질문의 가장 좋은 답변입니다. serverfault.com/questions/98745/…
rickfoosusa

5

supervisor 데몬 (프로세스 제어 관리자)은 다음과 유사한 구성으로 양쪽의 rsa 인증서를 생성 한 후 매우 잘 작동 할 수 있습니다.

[program:rsync-remoteserver]
command=rsync -avz --progress root@server.com:/destination /backup-path
stdout_logfile=/out-log-path  
stderr_logfile=/errlogpath

1

@ 피터의 대답은 매우 유용하지만 --update옵션 을 사용하는 것이 중요했습니다 . 연결이 재개 된 후 --updatersync 없이 처음부터 모두 동기화하려고했습니다. 을 사용하면 --update이미 존재하는 파일을 건너 뜁니다.

rsync --partial --update --progress -r [SOURCE] [DESTINATION]


2
--update이미 존재하는 파일을 건너 뜁니다 ... 대상에 완전히 복사되지 않은 파일 포함. 나는 그것이 대부분의 유스 케이스에 반대한다고 생각합니다.
durum

@durum 적어도 rsync 3.1.2에서는 사실이 아닙니다. 전송이 중단 된 후 동일한 파일에서 제대로 작동하는 것을 볼 수 있습니다. 나는 ssh를 통해 rsync를 사용했다 rsync --partial --update file1 remotehost:file1. 15 %를 양도 한 후 양도를 해지했습니다 (kill -KILL).
filiprem
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.