iBetter Books
수정

프로젝트 1: 자동 백업 스크립트

첫 번째 프로젝트는 자동 백업입니다. 서버를 운영하다 보면 데이터가 날아가는 사고는 언제든 일어납니다. 백업은 귀찮아서 미루다가 사고가 나고 나서야 후회하게 됩니다.

이 스크립트를 만들면 매일 새벽 지정한 디렉토리를 자동으로 압축 백업하고, 오래된 백업은 알아서 정리합니다.

요구사항

  • 설정 파일에서 백업 대상과 보관 기간을 읽습니다.
  • tar -czf로 날짜가 포함된 파일명으로 백업을 생성합니다.
  • find로 N일 이상 오래된 백업을 삭제합니다.
  • 성공/실패, 파일 크기를 로그에 기록합니다.
  • trap으로 오류 발생 시 알림을 남깁니다.
  • crontab에 등록해서 매일 새벽 자동 실행합니다.

설정 파일

먼저 설정 파일을 만듭니다. 스크립트에 설정을 직접 넣지 않고 파일로 분리하면 스크립트는 건드리지 않고 설정만 바꿀 수 있습니다.

# 새 파일: /home/ubuntu/scripts/backup.conf# 백업 대상 디렉토리 (공백 구분, 여러 개 가능)BACKUP_SOURCES="/home/ubuntu/projects /home/ubuntu/data"# 백업 파일 저장 위치BACKUP_DEST="/backup"# 로그 파일 위치LOG_FILE="/var/log/backup.log"# N일 이상 오래된 백업 삭제 (0이면 삭제 안 함)RETENTION_DAYS=7# 백업 파일 이름 접두사BACKUP_PREFIX="myserver"# 알림 이메일 (비워두면 이메일 발송 안 함)ALERT_EMAIL=""

백업 스크립트

#!/usr/bin/env bash# 새 파일: /home/ubuntu/scripts/backup.shset -euo pipefail# ==============================================================# 설정 파일 로드# ==============================================================SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"CONFIG_FILE="${SCRIPT_DIR}/backup.conf"if [[ ! -f "$CONFIG_FILE" ]]; then    echo "ERROR: 설정 파일을 찾을 수 없습니다: $CONFIG_FILE" >&2    exit 1fisource "$CONFIG_FILE"# ==============================================================# 로깅 함수# ==============================================================log() {    local level="$1"    shift    echo "$(date '+%Y-%m-%d %H:%M:%S') [${level}] $*" | tee -a "$LOG_FILE"}log_info()  { log "INFO " "$@"; }log_warn()  { log "WARN " "$@"; }log_error() { log "ERROR" "$@"; }# ==============================================================# 클린업 함수 (trap으로 등록)# ==============================================================TEMP_DIR=""cleanup() {    local exit_code=$?    if [[ -n "$TEMP_DIR" && -d "$TEMP_DIR" ]]; then        rm -rf "$TEMP_DIR"        log_info "임시 디렉토리 정리 완료"    fi    if [[ $exit_code -ne 0 ]]; then        log_error "백업이 비정상 종료되었습니다 (종료 코드: $exit_code)"        if [[ -n "${ALERT_EMAIL:-}" ]]; then            echo "백업 스크립트가 오류로 종료되었습니다. 로그를 확인하세요." \                | mail -s "[알림] 백업 실패 - $(hostname)" "$ALERT_EMAIL" 2>/dev/null || true        fi    fi}trap cleanup EXIT# ==============================================================# 유효성 검사# ==============================================================if [[ -z "${BACKUP_SOURCES:-}" ]]; then    log_error "BACKUP_SOURCES가 설정되지 않았습니다."    exit 1fi# 백업 저장 디렉토리 생성mkdir -p "$BACKUP_DEST"# ==============================================================# 백업 실행# ==============================================================DATE=$(date '+%Y%m%d_%H%M%S')BACKUP_FILE="${BACKUP_DEST}/${BACKUP_PREFIX}_${DATE}.tar.gz"log_info "===== 백업 시작 ====="log_info "대상: $BACKUP_SOURCES"log_info "저장: $BACKUP_FILE"# tar로 백업 생성if tar -czf "$BACKUP_FILE" $BACKUP_SOURCES 2>> "$LOG_FILE"; then    BACKUP_SIZE=$(du -sh "$BACKUP_FILE" | awk '{print $1}')    log_info "백업 완료: $BACKUP_FILE (크기: $BACKUP_SIZE)"else    log_error "tar 실패"    exit 1fi# ==============================================================# 오래된 백업 삭제# ==============================================================if [[ "${RETENTION_DAYS:-0}" -gt 0 ]]; then    log_info "${RETENTION_DAYS}일 이상 오래된 백업 삭제 중..."    DELETED_COUNT=0    while IFS= read -r old_file; do        rm -f "$old_file"        log_info "삭제됨: $old_file"        ((DELETED_COUNT++))    done < <(find "$BACKUP_DEST" -name "${BACKUP_PREFIX}_*.tar.gz" \                  -mtime +"$RETENTION_DAYS" -type f)    log_info "총 ${DELETED_COUNT}개 오래된 백업 삭제"fi# ==============================================================# 완료# ==============================================================log_info "===== 백업 완료 ====="

crontab 등록

스크립트에 실행 권한을 주고 crontab에 등록합니다.

chmod +x /home/ubuntu/scripts/backup.sh# 백업 저장 디렉토리 생성sudo mkdir -p /backupsudo chown ubuntu:ubuntu /backup# crontab 편집crontab -e

다음 줄을 추가합니다.

# 매일 새벽 3시에 백업 실행
0 3 * * * /home/ubuntu/scripts/backup.sh

수동 테스트

crontab에 등록하기 전에 먼저 수동으로 실행해 확인합니다.

/home/ubuntu/scripts/backup.sh

실행 결과입니다.

2026-04-24 09:15:01 [INFO ] ===== 백업 시작 =====
2026-04-24 09:15:01 [INFO ] 대상: /home/ubuntu/projects /home/ubuntu/data
2026-04-24 09:15:01 [INFO ] 저장: /backup/myserver_20260424_091501.tar.gz
2026-04-24 09:15:04 [INFO ] 백업 완료: /backup/myserver_20260424_091501.tar.gz (크기: 42M)
2026-04-24 09:15:04 [INFO ] 7일 이상 오래된 백업 삭제 중...
2026-04-24 09:15:04 [INFO ] 총 0개 오래된 백업 삭제
2026-04-24 09:15:04 [INFO ] ===== 백업 완료 =====

백업 파일을 확인합니다.

ls -lh /backup/
-rw-r--r-- 1 ubuntu ubuntu 42M Apr 24 09:15 myserver_20260424_091501.tar.gz

백업 파일을 복구해보려면 이렇게 합니다.

# 특정 위치에 압축 해제tar -xzf /backup/myserver_20260424_091501.tar.gz -C /tmp/restore/