파일처리_12 파일들을 다른 디렉터리에 동기화해서 백업처리하기

 
  • 출처 : 유닉스 리눅스 쉘스크립트 예제사전_한빛미디어

명령어: rsync
키워드: 백업, 동기, 차분, 원격 백업
사용처: 매일 새로운 로그 파일이 생성되는 등 파일이 늘어나는 디렉터리를 효과적으로 백업하고 싶을 때


실행 예제

$ ls /home/user1/myapp/log            로그 파일 확인
20131201.log	20131202.log	20131203.log

$ ./rsync.sh
sending incremental file list
log/
log/20131203.log

sent 428 bytes received 35 bytes 678.00 bytes/sec
total size is 345 speedup is 1.41

스크립트

#!/bin/sh
 
log_dir="/home/user1/myapp/log"
backup_dir="/backup/myapp"
 
# /home/park/myapp/log 안에 있는 로그 파일을
# /backup/myapp/log 디렉터리에 복사
rsync -av "$log_dir" "$backup_dir"

   

해설

이 스크립트는 로그 파일(20131201.log, 20131202.log, 20131203.log) 세 개가 저장된 /home/park/myapp/log 디렉터리에 있는 파일을 /bakcup/myapp/log 디렉터리로 백업합니다. 여기서 rsync 명령어를 써서 대량의 파일이 있더라도 파일 차분만 갱신하는 효율적인 백업이 포인트입니다.

실행 예제에서 로그 파일 세 개가 있어야 하는데 201303.log만 복사됩니다. 이것은 저번 실행 시 20131201.log, 20131202.log는 이미 복사되었고 이번에 새롭게 생긴 201303.log만 복사한다고 가정하고 있습니다. 이렇듯 차분만 복사하는 동작은 매일 로그 파일이 생기는 시스템처럼 추가로 신규 파일이 만들어지는 디렉터리 백업에 어울립니다.

여기서 이용하는 rsync 명령어는 이름처럼 파일을 sync(동기화)하는 명령어입니다. 이런 특징 때문에 서버 관리 용도로 널리 쓰입니다.  

  • 복사할 때는 원본과 대상의 차이를 바탕으로 갱신된 파일만 복사하므로 효율적이다.
  • 파일 타임스탬프, 퍼미션, 소유자 정보 등 파일 속성을 그대로 복사할 수 있다.
  • ssh를 써서 원격 서버에서도 복사할 수 있다.

rsync 명령어 사용법은 다음과 같습니다.

rsync [옵션] <복사 원본=""> <복사 대상="">

  예제에서 사용한 옵션은 -a(아카이브 모드)와 -v(verbose 모드, 상세모드)입니다. 아카이브 모드란 자주 사용하는 옵션을 하나로 묶은 옵션으로 앞서 말한 특징(파일 타임스탬프, 퍼미션, 소유자 정보를 그대로 복사)을 이용할 수 있습니다. 상세 모드는 실제로 복사하는 파일 목록과 전송량을 표시하는 옵션으로 명령어 실행 결과가 바로 확인 가능하므로 가능하면 지정하는 것이 좋습니다.

또 하나 기억해두면 좋을 옵션으로 -n(dry-run 모드)이 있습니다. -n을 쓰면 실제 파일 복사는 하지 않고 처리될 대상 파일 목록만 출력합니다. 이걸로 어떤 파일이 복사될지 확인할 수 있습니다.

rsync -avn /home/park/myapp/log /backup/myapp

  즉, 셸 스크립트를 작성하는 단계에서는 rsync에 -n 옵션을 추가해둡니다. 이러면 실제 파일 복사는 일어나지 않으므로 간단히 테스트할 수 있습니다. 원하는 대로 되는 걸 확인했으면 마지막에 -avn이라고 지정한 옵션을 -av로 수정해서 -n 옵션을 삭제하면 됩니다.

rsync 명령어는 복사 원본 디렉터리를 지정할 때 마지막에 슬래시를 붙이는지 붙이지 않는지에 따라 큰 차이가 있으므로 주의해야 합니다. 예를 들어 다음처럼 복사 원본 디렉터리 끝에 슬래시를 붙였다고 합시다.

rsync -avn /home/park/myapp/log/ /backup/myapp

rsync 명령어는 복사 원본 마지막에 슬래시가 있으면 디렉터리 자체는 복사하지 않고 그 디렉터리 안에 있는 파일과 서브디렉터리 전부를 복사합니다. 따라서 위에서는 log 디렉터리를 복사하는 것이 아니라 log 디렉터리 안에 있는 (20131201.log, 20131202.log, 20131203.log) 파일을 복사합니다.

만약 복사 원본 디렉터리 마지막에 슬래시가 있어서 디렉터리 자체는 복사하고 싶지 않다면 복사 대상도 디렉터리를 지정해야만 합니다.

이렇듯 rsync 명령어는 디렉터리 지정 시 주의해야 합니다. 혼란스럽지 않도록 예제처럼 ‘복사 원본은 디렉터리를 지정하지만 마지막에 슬래시를 붙이지 않는다’라는 식으로 미리 정해두는 것이 좋습니다.

   

주의사항

  • rsync 명령어는 원격 서버로 (또는 원격 서버에서) 백업을 할 수 있습니다. 이때 다음처럼 파일 경로 앞에 “사용자명@호스트명:”을 지정합니다.
    rsync -av /home/user1/myapp/log user1@server1:/backup/myapp
    

    기본 통신 프로토콜로 ssh를 사용합니다. 또는 명시적으로 ssh 프로토콜이라고 지정하려면 -e ssh 옵션을 사용합니다.

    rsync -av -e ssh /home/user1/myapp/log user1@server1:/backup/myapp
    
  • rsync 명령어는 차분 갱신을 하는데 복사 원본에서 삭제된 파일은 복사 대상에서 삭제되지 않습니다. 이럴 때 완전히 디렉터리를 동기화시키고 싶으면(즉, 복사 원본에서 지워진 파일을 복사 대상에서도 지우고 싶을때) –delete 옵션을 사용합니다.
    rsync -av --delete /home/user1/myapp/log user1@server1:/bakcup/myapp