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.servicecrond systemd unit
/etc/crontabsystem-wide cron schedule
/usr/bin/crontab사용자 crontab 관리 명령
/etc/cron.allowcrontab 사용 허용 사용자 목록
/etc/cron.denycrontab 사용 차단 사용자 목록

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 2

2. cron 시간 형식

분 시 일 월 요일 명령

0 2 * * * 매일 02:00
*/10 * * * * 10분마다
30 1 * * 1 매주 월요일 01:30
0 3 1 * * 매월 1일 03:00

3. 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.sh

6. 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 crond

7. 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 -l

8. 실행 로그 확인

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 || true

systemd timer로 대체할 때

정교한 의존성, missed run 처리, 로그 추적이 필요하면 cron 대신 systemd timer를 사용할 수 있다. 단순 반복 백업은 cron으로 충분하고, 서비스 상태와 연동되는 작업은 timer가 더 적합하다.

마무리

cron과 rsync 조합은 단순하지만 실수하면 삭제까지 동기화할 수 있다. --delete를 쓰기 전에는 --dry-run--itemize-changes로 결과를 확인하고, cron에는 긴 명령 대신 script를 등록하며, 로그를 남겨 나중에 실패 원인을 추적할 수 있게 해야 한다.

문서 링크

BGM EVER