Linux 동기화 (cron, rsync)
Linux 동기화 가이드입니다. crond, cron.allow, rsync --dry-run, --delete, SSH 원격 백업, cron.d 스케줄과 로그 확인을 정리했습니다.
Linux 동기화: cron과 rsync로 주기 백업 구성
cron은 정해진 시간에 명령을 실행하는 scheduler이고, rsync는 변경된 파일만 효율적으로 복사하는 동기화 도구다. 둘을 같이 사용하면 특정 디렉터리를 매일 또는 매시간 원격 서버로 백업할 수 있다. 실습에는 관련 파일 목록이 있었으므로, 여기서는 실제 백업 job 작성과 검증까지 이어서 정리한다.
cron 관련 파일
| 경로 | 용도 |
|---|---|
/usr/lib/systemd/system/crond.service | crond systemd unit |
/etc/crontab | system-wide cron schedule |
/usr/bin/crontab | 사용자 crontab 관리 명령 |
/etc/cron.allow | crontab 사용 허용 사용자 목록 |
/etc/cron.deny | crontab 사용 차단 사용자 목록 |
1. 패키지와 서비스 확인
sudo dnf install -y cronie rsync
systemctl status crond --no-pager
sudo systemctl enable --now crond
which crontab
which rsync
rsync --version | head -n 22. cron 시간 형식
분 시 일 월 요일 명령
0 2 * * * 매일 02:00
*/10 * * * * 10분마다
30 1 * * 1 매주 월요일 01:30
0 3 1 * * 매월 1일 03:003. rsync 기본 사용법
source 경로 뒤의 slash 유무는 결과가 달라진다. 아래처럼 /data/app/로 쓰면 디렉터리 자체가 아니라 내부 내용이 대상에 복사된다.
rsync -avh --dry-run /data/app/ /backup/app/
rsync -avh /data/app/ /backup/app/삭제까지 동기화할 때는 반드시 dry-run으로 먼저 확인한다.
rsync -avh --delete --dry-run /data/app/ /backup/app/
rsync -avh --delete /data/app/ /backup/app/4. SSH 기반 원격 백업
백업 전용 계정과 SSH key를 사용한다. 실제 운영에서는 key 권한과 접근 가능한 directory를 제한한다.
sudo useradd -m backupuser
sudo -u backupuser ssh-keygen -t ed25519 -f /home/backupuser/.ssh/id_ed25519 -N ""
sudo -u backupuser ssh-copy-id backupuser@backup.example.com
sudo -u backupuser ssh backupuser@backup.example.com 'hostname; mkdir -p ~/app-backup'원격 동기화 명령은 다음처럼 검증한다.
sudo -u backupuser rsync -avh --delete --dry-run /data/app/ backupuser@backup.example.com:~/app-backup/
sudo -u backupuser rsync -avh --delete /data/app/ backupuser@backup.example.com:~/app-backup/5. 백업 스크립트 작성
cron에는 긴 명령을 직접 넣기보다 script 파일을 넣는 편이 관리하기 쉽다.
sudo mkdir -p /usr/local/sbin /var/log/backup
cat <<'EOF' | sudo tee /usr/local/sbin/rsync-app-backup.sh
#!/usr/bin/env bash
set -euo pipefail
SRC="/data/app/"
DST="backupuser@backup.example.com:~/app-backup/"
LOG="/var/log/backup/rsync-app-$(date +%Y%m%d).log"
rsync -avh --delete --itemize-changes "${SRC}" "${DST}" >>"${LOG}" 2>&1
EOF
sudo chmod 750 /usr/local/sbin/rsync-app-backup.sh6. cron 등록
매일 02:10에 실행하도록 /etc/cron.d에 등록한다.
cat <<'EOF' | sudo tee /etc/cron.d/rsync-app-backup
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
10 2 * * * backupuser /usr/local/sbin/rsync-app-backup.sh
EOF
sudo chmod 644 /etc/cron.d/rsync-app-backup
sudo systemctl reload crond7. cron 접근 제한
/etc/cron.allow가 있으면 그 파일에 등록된 사용자만 crontab을 사용할 수 있다. 없고 /etc/cron.deny만 있으면 deny에 없는 사용자는 사용할 수 있다.
echo "backupuser" | sudo tee /etc/cron.allow
sudo chmod 600 /etc/cron.allow
sudo -u backupuser crontab -l8. 실행 로그 확인
sudo journalctl -u crond --since "1 hour ago" --no-pager
sudo tail -n 100 /var/log/backup/rsync-app-$(date +%Y%m%d).log
sudo grep CRON /var/log/cron 2>/dev/null | tail -n 20 || truesystemd timer로 대체할 때
정교한 의존성, missed run 처리, 로그 추적이 필요하면 cron 대신 systemd timer를 사용할 수 있다. 단순 반복 백업은 cron으로 충분하고, 서비스 상태와 연동되는 작업은 timer가 더 적합하다.
마무리
cron과 rsync 조합은 단순하지만 실수하면 삭제까지 동기화할 수 있다. --delete를 쓰기 전에는 --dry-run과 --itemize-changes로 결과를 확인하고, cron에는 긴 명령 대신 script를 등록하며, 로그를 남겨 나중에 실패 원인을 추적할 수 있게 해야 한다.