[L] 백업스크립트_home 디렉토리 백업
💡 요약 정리
- /home 디렉토리 전체를 자동으로 백업하는 bash 스크립트입니다
- /home/BACKUP 디렉토리에 날짜별로 백업본을 저장합니다
- 디스크 사용량이 95% 이상일 경우 백업을 중지하여 디스크 풀 방지
- 기본 7일간 백업본을 보관하며, 오래된 백업은 자동 삭제됩니다
/home/BACKUP 디렉토리를 생성하여, /home 디렉토리 내의 모든 데이터를 백업하는 스크립트입니다.
이 스크립트는 날짜별로 백업본을 관리하며, 지정된 기간이 지난 백업은 자동으로 삭제합니다.
1. 백업 스크립트 전체 코드
① backup_home.sh
#!/bin/bash
################################################################################
# /home 디렉토리 백업 스크립트
################################################################################
##### Today #####
## 오늘 날짜
DATE=`/bin/date +%Y_%m_%d`
##### Keeping day for Backup data #####
## 백업본 보관 주기(일주일간 보관) 숫자를 수정하여 원하는 기간으로 변경
KEEP=7
##### Delete day for Backup data #####
## 삭제할 백업본의 날짜를 지정
OLDDATE=`/bin/date +%Y_%m_%d -d "${KEEP} day ago"`
##### Disk Usage #####
## /home 디렉토리 사용량
USAGE=`/bin/df -h | grep /home | awk '{print $5}' | cut -d% -f1`
##### Make Backup DIR #####
## 백업 데이터를 보관할 디렉토리와 log 디렉토리
## 디렉토리가 존재하지 않으면 생성한다
BACKUPDIR="/home/BACKUP/home"
if [ ! -e ${BACKUPDIR}/log ];then
mkdir -p ${BACKUPDIR}/log
fi
if [ ! -e ${BACKUPDIR}/${DATE} ];then
mkdir -p ${BACKUPDIR}/${DATE}
fi
##### Run BACKUP #####
## 백업 실행. /home 파티션의 사용량이 95%이상일 경우 백업이 실행 되지 않고, 에러로그를 생성한다.
## 백업을 하지 않을 디렉토리가 있을 경우는 아래의 "grep -v BACKUP" 과 같이 파이프(|)로 연결하여 추가 한다.
## 백업 디렉토리 내에 날짜별로 디렉토리를 생성하여 각각의 디렉토리명으로 압축 파일을 생성하여 백업
if [ $USAGE -ge 95 ]
then
echo "Not enough Disk space... " > ${BACKUPDIR}/log/${DATE}_err.log
exit 1;
else
cd /home
for list in $(ls -l /home | grep drwx | awk '{print $9}' | grep -v BACKUP | grep -v lost+found)
do tar cvzfp ${BACKUPDIR}/${DATE}/${list}.tar.gz $list
done
/bin/rm -rf ${BACKUPDIR}/home/${OLDDATE}
echo "$DATE BACKUP OK" > ${BACKUPDIR}/log/${DATE}.log
ls -l ${BACKUPDIR}/$DATE/ >> ${BACKUPDIR}/log/${DATE}.log
fi
2. 스크립트 구성 요소 설명
① 날짜 변수 설정
DATE=`/bin/date +%Y_%m_%d`
기능:
- 오늘 날짜를 YYYY_MM_DD 형식으로 저장
- 백업 디렉토리 이름과 로그 파일명에 사용
예시:
2025_11_17
② 백업 보관 주기 설정
KEEP=7
기능:
- 백업본을 며칠 동안 보관할지 설정
- 기본값: 7일 (일주일)
수정 방법:
KEEP=14 # 2주간 보관
KEEP=30 # 30일간 보관
③ 삭제할 백업본 날짜 계산
OLDDATE=`/bin/date +%Y_%m_%d -d "${KEEP} day ago"`
기능:
- KEEP 일수 전의 날짜를 계산
- 해당 날짜의 백업 디렉토리를 삭제 대상으로 지정
예시:
오늘: 2025_11_17
KEEP: 7
OLDDATE: 2025_11_10
④ 디스크 사용량 체크
USAGE=`/bin/df -h | grep /home | awk '{print $5}' | cut -d% -f1`
기능:
- /home 파티션의 사용률(%)을 확인
- 95% 이상일 경우 백업 중 지
출력 예시:
$ df -h | grep /home
/dev/sda2 100G 80G 15G 85% /home
^^
85 (USAGE 변수값)
⑤ 백업 디렉토리 생성
BACKUPDIR="/home/BACKUP/home"
if [ ! -e ${BACKUPDIR}/log ];then
mkdir -p ${BACKUPDIR}/log
fi
if [ ! -e ${BACKUPDIR}/${DATE} ];then
mkdir -p ${BACKUPDIR}/${DATE}
fi
생성되는 디렉토리 구조:
/home/BACKUP/home/
├── log/ # 백업 로그 디렉토리
├── 2025_11_10/ # 7일 전 백업 (삭제 예정)
├── 2025_11_11/ # 6일 전 백업
├── ...
└── 2025_11_17/ # 오늘 백업 (생성)
3. 백업 실행 로직
① 디스크 공간 체크
if [ $USAGE -ge 95 ]
then
echo "Not enough Disk space... " > ${BACKUPDIR}/log/${DATE}_err.log
exit 1;
동작:
- 사용률이 95% 이상이면 백업 중지
- 에러 로그 생성:
${DATE}_err.log - 스크립트 종료 (exit 1)
예시 에러 로그:
/home/BACKUP/home/log/2025_11_17_err.log
② 백업 실행
cd /home
for list in $(ls -l /home | grep drwx | awk '{print $9}' | grep -v BACKUP | grep -v lost+found)
do tar cvzfp ${BACKUPDIR}/${DATE}/${list}.tar.gz $list
done
동작 흐름:
- /home 디렉토리로 이동
- /home 하위 디렉토리 목록 가져오기
- 제외할 디렉토리 필터링:
grep -v BACKUP: BACKUP 디렉토리 제외grep -v lost+found: lost+found 디렉토리 제외
- 각 디렉토리를 tar.gz로 압축
백업 예시:
tar cvzfp /home/BACKUP/home/2025_11_17/user1.tar.gz user1
tar cvzfp /home/BACKUP/home/2025_11_17/user2.tar.gz user2
tar cvzfp /home/BACKUP/home/2025_11_17/user3.tar.gz user3
③ 추가 디렉토리 제외
특정 디렉토리를 백업에서 제외하려면:
# 기존
for list in $(ls -l /home | grep drwx | awk '{print $9}' | grep -v BACKUP | grep -v lost+found)
# temp 디렉토리 추가 제외
for list in $(ls -l /home | grep drwx | awk '{print $9}' | grep -v BACKUP | grep -v lost+found | grep -v temp)
④ 오래된 백업 삭제
/bin/rm -rf ${BACKUPDIR}/home/${OLDDATE}
동작:
- KEEP 일수 전의 백업 디렉토리 삭제
- 예: 7일 전 백업 자동 삭제
⑤ 백업 로그 생성
echo "$DATE BACKUP OK" > ${BACKUPDIR}/log/${DATE}.log
ls -l ${BACKUPDIR}/$DATE/ >> ${BACKUPDIR}/log/${DATE}.log
생성되는 로그 예시:
2025_11_17 BACKUP OK
total 15360
-rw-r--r-- 1 root root 5242880 Nov 17 10:30 user1.tar.gz
-rw-r--r-- 1 root root 7340032 Nov 17 10:31 user2.tar.gz
-rw-r--r-- 1 root root 2621440 Nov 17 10:32 user3.tar.gz
4. 스크립트 사용 방법
① 스크립트 파일 생성
vi /root/backup_home.sh