
rsync란
- Remote Sync(원격 동기화)의 약자로 이름처럼 한 위치(로컬/원격) 의 파일을 다른 위치로 동기화하는 데 쓰인다.
- 로컬 시스템끼리 동기화하거나, 네트워크를 통해 원격 서버와 동기화할 수 있다.
- 단순 복사가 아니라, 이미 있는 파일과 비교해서 변화된 부분만 전송하는 효율적인 방식이라 빠르고 대역폭 절약에 유리하다.
rsync 장점
- 존에 있는 파일과 비교해서 변경된 부분만 보내므로 전체를 매번 다시 복사하지 않는다
- 로컬 ↔ 원격 어디든 사용 가능하다
- SSH 등 보안 연결로 파일 전송이 가능하다
rsync를 crontab에 등록하여 주기적으로 실행되도록 설정함으로써, 변경된 파일만 증분 전송하는 효율적인 백업 자동화 환경을 구축할 수 있다.
1. cron, rsync 설치 및 실행
sudo apt update && sudo apt install -y cron
sudo apt-get install -y rsync
service cron start
cron을 시작 해 줘야 등록된 스케줄에 맞춰서 동작을 하게 된다.
2. 쉘 스크립트 작성
#!/bin/bash
# ======================================================
# Track new files from server using rsync
# - cron friendly
# - new files only
# ======================================================
set -euo pipefail # -e : 명령 하나라도 실패 시 즉시 종료 / -o pipefail : 파이프 중간에 실패 시 실패로 간주
# config
SRC_USER='user name'
SRC_HOST='IP 또는 domain 주소'
SRC_BASE='소스 경로' # source directory
DST_BASE='백업해 둘 경로'
LOG_DIR='/var/log/rsync'
LOG_FILE="${LOG_DIR}/track_$(date +%F).log"
RSYNC_BIN="/usr/bin/rsync"
SSH_BIN="/usr/bin/ssh"
mkdir -p "$DST_BASE"
mkdir -p "$LOG_DIR"
log() {
echo "[$(date '+%F %T')] $1" | tee -a "$LOG_FILE"
}
log "==== rsync check start ===="
# -a : 권한, 시간, 심볼릭 링크 유지 / -z : 전송 중 압축
# --ignore-existing : 이미 존재하는 파일은 덮어쓰지 않음
# --partial : 전송 중 끊겨도 받던 파일 유지, 다음 실행 시 이어받기
# --timeout=600 : 10분 간 응답 없으면 실패 처리
# --human-readable : 저장되는 파일의 용량을 읽기 쉽도록 로그에 기록 해 줌
# --itemize-changes : 진행 상태 로그에 표시
# -e "$SSH_BIN" : rsync transport로 ssh 사용, 포트 변경, 옵션 확장 가능
$RSYNC_BIN -az \
--ignore-existing \
--partial \
--timeout=600 \
--human-readable \
--itemize-changes \
-e "$SSH_BIN" \
"${SRC_USER}@${SRC_HOST}:${SRC_BASE}/" \
"${DST_BASE}/" >> "$LOG_FILE" 2>&1
# 중간에 죽었으면 이 로그 없을 것 → 장애 판단 기준
log "==== rsync pull finished ===="
위 스크립트처럼 동작 스크립트를 작성 한 후 해당 스크립트를 cron에 등록 해 주면 된다.
위 스크립트는 특정 경로에 새로운 파일이 생겼는지 확인 후 새로운 파일이 감지가 됐을 때 해당 파일만 별도 경로로 이동 시키는 스크립트이다.
3. ssh 키 인증
rsync transport로 ssh 사용할 것이기 때문에 ssh 키 인증을 사전에 해 줘야 한다.
cron을 동작 시킬 곳에서 ssh 키 인증을 해 주면 된다.
sudo -i
ssh-keygen -t ed25519
엔터 3번 치면 키가 생성되고 이때 생성된 키의 경로를 저장 해 둔다.
ssh-copy-id user@외부 pc ip
위 명령어를 통해 공개키를 외부 pc에 등록을 하고 마지막으로 비밀번호를 입력 해 주면 된다.
이후 cron을 설정할 서버에서 새로운 파일이 생기는 서버로 ssh 접속 했을 때 비밀번호를 물어보지 않고 연결 된다면 제대로 설정 된 것이다.
4. host key 자동 승인 yes/no 제거
한번만 수동으로 ssh 접속 후 “Are you sure you want to continue connecting?” 뜨면 yes 입력 해 주면 이후 절대 안 물어본다.
이때 ssh 접속 정보가 /root/.ssh/known_hosts에 저장되는데 이 파일을 cron에서 그대로 사용한다.
5. 스크립트 동작
스크립트에 구문 오류가 없는지 확인 위해 단독 실행을 해 보는 것이 좋다.
# 스크립트 권한 부여
sudo chmod +x /workspace/script.sh
# 스크립트 실행
bash -x /workspace/script.sh
스크립트에 권한을 부여 후 실행을 하면 되는데 crontab 실행 시에도 스크립트의 파일명이 아니라 위처럼 꼭 pull path를 적어줘야 한다.
단독 실행 시 오류 없이 동작 한다면 cron에 일정 등록을 하면 된다.
6. cron에 일정 등록
# cron 편집기 열기
crontab -e
위 명령어를 입력하면 편집기 선택을 할 수 있는데 nano / vim 중에 편한 걸로 에디터를 선택 해 주고 사용하면 된다.
cron의 일정 포맷 기본은 분 시 일 월 요일 실행할_명령 이렇게 되어 있다.
ex)
매분, 매시간, 매일, 매월 ⇒ 1분마다 /home/ubuntu/start.sh 파일을 실행 : * * * * * /home/ubuntu/start.sh
매일 3시에 /home/ubuntu/start.sh 파일을 실행 : 0 3 * * * /home/ubuntu/start.sh
10분 마다 실행 : */10 * * * * /usr/local/bin/track_new_mp4.sh
10분 간격, 4시, 매일, 매월, 매일, 즉 매일 4시, 4시 10분, 4시 20분, 4시 30분 /home/ubuntu/start.sh파일을 실행 : */10 4 * * * /home/ubuntu/start.sh
6시간마다 /home/ubuntu/start.sh 파일을 실행 : 0 */6 * * * /home/ubuntu/start.sh
1시간 마다 실행 : 0 * * * * /usr/local/bin/script.sh
평일(월요일~금요일) 3시에 /home/ubuntu/start.sh 파일을 실행 : 0 3 * * 1-5 /home/ubuntu/start.sh
주말(일요일, 토요일) 3시에 /home/ubuntu/start.sh 파일을 실행 : 0 3 * * 0,6 /home/ubuntu/start.sh
매일 새벽 5시에 재부팅하기 : 0 5 * * * /sbin/shutdown -r now
⇒ 해당 포맷에 맞춰서 원하는 일정, 명령어를 cron 편집기에서 하단에 추가 해 주면 된다.
7. cron 등록 확인
crontab -l
해당 명령어를 입력했을 때 추가한 일정이 뜨면 제대로 등록이 된 것이다.
8. cron 동작 확인
등록한 일정대로 스크립트가 동작하는지 확인 하면 된다.
만약 10분 마다 실행하도록 했다면 매 시간 10분 단위로 실행이 됨. cron 등록 시간이 15시 03분이라면 첫 실행이 13분에 실행되는 게 아니라 15시 10분에 첫 실행이 됨. 다음 실행 시간은 15시 20분이 된다. 동일하게 1시간 마다 실행하도록 했다면 매 시간 정각에 실행 됨. cron 등록 시간이 15시 02분이라면 첫 실행은 16시 정각에 실행된다.