프로젝트 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/