
물론입니다. 이 명령은 매일 새벽 5시에 backup01 디렉터리를 USB 백업 디스크로 rsync 백업하고, 시작/종료 결과를 로그 파일에 기록하는 cron 작업입니다.
전체를 먼저 보면:
0 5 * * * echo "=== $(date) rsync start ===" >> /home/blogs80/rsync-backup01.log; /usr/bin/rsync -av --delete /home/blogs80/backup01 /mnt/usb-gitbackup/ >> /home/blogs80/rsync-backup01.log 2>&1; echo "=== $(date) rsync end: $? ===" >> /home/blogs80/rsync-backup01.log
1. 0 5 * * *
0 5 * * *
cron의 실행 시간을 의미합니다.
위치 | 의미 | 값 |
|---|---|---|
1번째 | 분 |
|
2번째 | 시 |
|
3번째 | 일 |
|
4번째 | 월 |
|
5번째 | 요일 |
|
따라서:
매일 오전 5시 00분에 실행
됩니다.
2. 백업 시작 기록
echo "=== $(date) rsync start ===" >> /home/blogs80/rsync-backup01.log
echo
문자열을 출력합니다.
예를 들어:
=== Fri Oct 2 05:00:00 KST 2026 rsync start ===
같은 내용이 만들어집니다.
$(date)
$(date)
는 현재 날짜와 시간을 가져오는 명령 치환입니다.
예:
date
실행 결과가
Fri Oct 2 05:00:00 KST 2026
라면,
echo "=== $(date) rsync start ==="
는
=== Fri Oct 2 05:00:00 KST 2026 rsync start ===
가 됩니다.
>>
>> /home/blogs80/rsync-backup01.log
는 로그 파일의 맨 뒤에 추가하라는 뜻입니다.
중요한 점은 >와 다릅니다.
> file
→ 기존 내용을 지우고 새로 작성
>> file
→ 기존 내용은 유지하고 뒤에 추가
따라서 매일 백업할 때마다 로그가 계속 쌓입니다.
3. 실제 rsync 백업
핵심 부분입니다.
/usr/bin/rsync -av --delete /home/blogs80/backup01 /mnt/usb-gitbackup/
의미는:
/home/blogs80/backup01의 내용을/mnt/usb-gitbackup/에 동기화한다.
입니다.
4. /usr/bin/rsync
/usr/bin/rsync
rsync 프로그램을 실행합니다.
cron에서는 일반 터미널보다 환경변수가 제한될 수 있기 때문에:
rsync
보다는
/usr/bin/rsync
처럼 실행 파일의 정확한 위치를 지정하는 것이 안전합니다.
현재 서버에서 다음으로 확인할 수 있습니다.
which rsync
보통:
/usr/bin/rsync
가 나옵니다.
5. -a
-a
는 archive mode입니다.
백업에서 매우 많이 사용하는 옵션입니다.
대략적으로 다음과 같은 속성을 보존하면서 복사합니다.
디렉터리 구조
파일 권한
소유자/그룹
수정 시간
심볼릭 링크
파일 등을 재귀적으로 복사
즉 단순히 파일만 복사하는 것보다 원본의 구조와 속성을 최대한 유지하면서 동기화합니다.
6. -v
-v
는 verbose입니다.
rsync가 무엇을 하고 있는지 자세히 출력합니다.
예를 들어:
sending incremental file list
README.md
src/app.js
src/config.js
sent 12,345 bytes
received 234 bytes
total size is 1,234,567
같은 정보가 출력됩니다.
그리고 이 출력은 뒤에서 설명할 >> ...log 때문에 로그 파일에 저장됩니다.
7. --delete
이 옵션은 특히 주의해야 합니다.
--delete
는 원본에는 없어진 파일을 백업 쪽에서도 삭제합니다.
예를 들어 원래:
backup01/
├── a.txt
├── b.txt
└── c.txt
였고 USB에도:
gitbackup/
├── a.txt
├── b.txt
└── c.txt
가 있다고 하겠습니다.
그런데 원본에서:
c.txt
를 삭제했습니다.
다음날 rsync를 실행하면:
backup01/
├── a.txt
└── b.txt
USB도:
gitbackup/
├── a.txt
└── b.txt
가 됩니다.
즉:
USB 백업을 원본과 똑같은 상태로 유지하는 옵션
입니다.
다만 이것은 버전 백업이 아닙니다.
예를 들어 실수로 원본에서 중요한 파일을 삭제하면:
rsync --delete
가 다음 백업 때 USB에서도 그 파일을 삭제할 수 있습니다.
따라서 이것은:
"현재 상태의 미러링 백업"
에 가깝습니다.
8. 원본과 목적지
/home/blogs80/backup01
가 원본입니다.
/mnt/usb-gitbackup/
가 USB 백업 위치입니다.
따라서 개념적으로:
서버
/home/blogs80/backup01
│
│ rsync
▼
USB
/mnt/usb-gitbackup/
입니다.
9. rsync 결과를 로그에 저장
뒤의:
>> /home/blogs80/rsync-backup01.log 2>&1
도 중요합니다.
>>
rsync의 **정상 출력(stdout)**을 로그 파일 뒤에 추가합니다.
>> /home/blogs80/rsync-backup01.log
2>&1
이 부분은 초보자에게 조금 헷갈릴 수 있습니다.
Linux에는 기본적으로 출력 통로가 두 개 있습니다.
1 = 정상 출력(stdout)
2 = 오류 출력(stderr)
따라서:
2>&1
은:
오류 출력(2)을 정상 출력(1)이 가는 곳으로 보내라.
라는 뜻입니다.
결과적으로:
>> /home/blogs80/rsync-backup01.log 2>&1
는
rsync의 정상 메시지와 오류 메시지를 모두
rsync-backup01.log에 기록
하게 됩니다.
10. rsync가 끝난 뒤 종료 코드 기록
마지막 부분입니다.
echo "=== $(date) rsync end: $? ===" >> /home/blogs80/rsync-backup01.log
여기서 중요한 것이:
$?
입니다.
$?는 **바로 직전에 실행된 명령의 종료 코드(exit status)**입니다.
일반적으로:
0
이면 성공입니다.
0이 아닌 값이면 문제가 발생했다는 의미입니다.
따라서 예를 들어 성공하면:
=== Fri Oct 2 05:00:15 KST 2026 rsync end: 0 ===
처럼 기록될 수 있습니다.
실패하면:
=== Fri Oct 2 05:00:15 KST 2026 rsync end: 23 ===
같이 나올 수 있습니다.
11. ;의 의미
전체 명령에는 세 개의 작업이 있습니다.
echo "start"...;
rsync ...;
echo "end..."
여기서:
;
는
앞의 명령이 끝나면 다음 명령을 실행하라
는 의미입니다.
중요한 것은 앞 명령이 실패해도 다음 명령을 실행한다는 점입니다.
예를 들어 rsync가 실패해도:
echo "=== ... rsync end: $? ==="
가 실행됩니다.
그래서 실패한 경우에도 종료 코드를 로그에 남길 수 있습니다.
12. 실제로 로그에는 어떻게 보일까?
예를 들어 정상적으로 백업되었다면:
=== Fri Oct 2 05:00:00 KST 2026 rsync start ===
sending incremental file list
...
sent 12,345 bytes
received 234 bytes
total size is 123,456,789
=== Fri Oct 2 05:00:08 KST 2026 rsync end: 0 ===
다음날 또 실행되면 기존 로그를 삭제하지 않고 뒤에 추가됩니다.
=== Fri Oct 2 05:00:00 KST 2026 rsync start ===
...
=== Fri Oct 2 05:00:08 KST 2026 rsync end: 0 ===
=== Sat Oct 3 05:00:00 KST 2026 rsync start ===
...
=== Sat Oct 3 05:00:03 KST 2026 rsync end: 0 ===
전체를 아주 간단하게 해석하면
이 한 줄은 사실 다음과 같은 작업입니다.
매일 오전 5시
↓
"백업 시작"을 로그에 기록
↓
/home/blogs80/backup01
↓
rsync로
↓
/mnt/usb-gitbackup/
↓
정상 출력 + 오류를 로그에 기록
↓
백업이 끝나면 종료 코드 기록
즉 사용하시는 서버 환경에서는 backup01를 USB에 매일 자동으로 동기화하고, 나중에 로그를 확인해서 백업 성공 여부를 확인하기 위한 cron 작업이라고 보면 됩니다.
한 가지 특히 기억하실 점
현재 명령의:
--delete
때문에 이것은 **"삭제된 파일도 보존하는 백업"이 아니라 "원본과 USB를 똑같이 맞추는 백업"**입니다.
따라서 Git 저장소 자체를 USB에 보존하는 목적이라면 괜찮지만, 실수로 파일이나 저장소를 삭제했을 때 복구할 수 있는 이력형 백업을 원한다면 별도의 방법을 사용하는 것이 좋습니다.
