pcharley님의 스크립트 backup.sh
#!/bin/bash
##############################
# 변수 설정 및 함수 로딩
##############################
FILESYSTEM= # 마운트할때 파일 시스템을 명시
HOST= # 여러 호스트가 NFS 파일시스템에 백업할 경우 중복을 방지하기 위해
TERM= # 기간(month, week, day 중 하나로 명시)
DIR1= # 백업할 부모 디렉토리(여러 부모 디렉토리를 명시할 수 있다)
#DIR2=
#DIR3=
DIR1_01= # 백업할 장소 명시(여러 부모 디렉토리의 여러 백업 장소를 명시할 수 있다)
DIR1_02=
DIR1_03=
#DIR2_01=
#DIR2_02=
#DIR2_03=
#DIR2_01=
#DIR2_02=
#DIR2_03=
DEV= # 백업 매체 명시. (NFS로 공유되는 파일 시스템을 명시)
MNT= # 백업 매체 마운트 포인터 명시
ADMIN=root # 결과를 e-mail로 받을 사람
DATE1=`date +$HOST-%Y-%m-%d-%H-%M` # file 이름을 정하기 위해
DATE2=`date +$HOST-%Y:%m:%d` # 보고서에 들어갈 날짜
# Source Function Library 함수 로딩
[ -f /usr/local/bin/function.sh ] || exit 0
. /usr/local/bin/functions.sh
########################################
# 장치 마운팅 및 용량 확인
########################################
mnt # 장치 마운트
storage first # 백업전 용량 확인
########################################
# 작업 파일 검색 및 백업
########################################
backup # backup 실행.
########################################
# 백업 결과 및 용량 확인
########################################
check
storage second # 용량 확인(backup후)
########################################
# 보고서작성 및 메일전송
########################################
report ; mailto
########################################
# 언마운팅및 임시파일 삭제
########################################
umnt ; remove
pcharley님 2번째 스크립트 function.sh
#!/bin/sh
########################################
# 마운팅 함수 정의
########################################
mnt()
{
if [ ! -d $MNT ]
then
mkdir -P $MNT # 상위 DIR이 없으면 생성
[ -f /tmp/$TERM.create ] || touch /tmp/$TERM.create # 보고서를 위해서 임시 파일 생성
[ -d $MNT ] && echo -e "t$TERM directory creaed" >> /tmp/$TERM.create
fi
mount -t $FILESYSTEM $DEV $MNT || echo "파일시스템 마운트에 이상이 있습니다"; exit 0
if [ ! -d $MNT/$HOST_$TERM ]
then
mkdir $MNT/$HOST_$TERM
[ -f /tmp/$TERM.create ] || touch /tmp/$TERM.create
[ -d $MNT/$HOST_$TERM ] && echo -e "t$TERM directory created" >> /tmp/$TERM.create
fi
}
umt()
{
if [ -d $MNT/$HOST_$TERM ]
then
umount $MNT
fi
}
########################################
# 용량확인 함수 정의
########################################
storage()
{
if [ "$1" = "first" ] # 백업하기 전
then
STO1=`du -sh $MNT | cut -c1-4`
STO2=`du -sh $MNT/$HOST_$TERM | cut -c1-4`
elif [ "$1"="second" ] # 백업한 후
then
STO3=`du -sh $MNT | cut -c1-4`
STO4=`du -sh $MNT/$HOST_$TERM | cut -c1-4`
fi
}
########################################
# 백업 함수 정의. tar에서 제공하는 스냅샷 기능을 사용해도 됨
########################################
backup()
{
case $TERM in
month)
tar cPf $MNT/$HOST_$TERM/$DATE1.tar -C $DIR ./$DIR_01 -C $DIR ./$DIR_02 -C $DIR ./$DIR_03;; # P : 상대경로를 절대 경로로 바꿈
week) # 목록 찾기(변경분)
find $DIR01 $DIR02 $DIR03 -mtime -7 ! -type d -print > /tmp/$TERM.work;; # 증분된 목록을 만듬
day) # 목록 찾기(변경분)
find $DIR01 $DIR02 $DIR03 -mtime -1 ! -type d -print > /tmp/$TERM.work;; # 증분된 목록을 만듬
esac
if [ -s /tmp/$TERM.work ]
then
tar cP -T /tmp/$TERM.work -f $MNT/$HOST_$TERM/$DATE1.tar # 백업할 목록을 파일에서 찾음
fi
}
# tar의 증분 백업 기능을 이용. 이 경우는 파일을 덮어쓰게 되므로 덮어쓰기 전에 백업매체에 옮겨야 한다.
# 밑에서부터 주석된 부분은 이것을 적용시켰을 겨우에 해당
#backup()
#{
# case $TERM in
# month)
# tar -g $MNT/$HOST.list cPf $MNT/$HOST_$TERM/$HOST.tar -C $DIR01 . -C $DIR02 . -C $DIR03 .;;
# week)
# tar -g $MNT/$HOST.list cPf $MNT/$HOST_$TERM/$HOST.tar -C $DIR01 . -C $DIR02 . -C $DIR03 .;;
# day)
# tar -g $MNT/$HOST.list cPf $MNT/$HOST_$TERM/$HOST.tar -C $DIR01 . -C $DIR02 . -C $DIR03 .;;
# esac
#}
########################################
# 백업결과 확인 함수 정의
########################################
check()
{
case $TERM in
month)
tar tf $MNT/$HOST_$TERM/$DATE1.tar > /tmp/$TERM.backup;; # 목록만 출력
*)
tar tf $MNT/$HOST_$TERM/$DATE1.tar > /tmp/$TERM.backup # 목록만 출력
diff /tmp/$TERM.work /tmp/$TERM.backup > /tmp/$TERM.problem
esac
}
#check()
#{
# case $TERM in
# month)
# tar df $MNT/$HOST_$TERM/$HOST.tar > /tmp/$TERM.backup;; # 목록만 출력
# *)
# tar tf $MNT/$HOST_$TERM/$HOST.tar > /tmp/$TERM.backup # 목록만 출력
# esac
#}
#----------
# 사용량 출력
#----------
print_storage()
{
echo -e "t백업전, $MNT의 총사용량 : $STO1" >> /tmp/$TERM.result
echo -e "t백업후, $MNT의 총사용량 : $STO3" >> /tmp/$TERM.result
echo -e "t백업전, $MNT의 $HOST_$TERM 디렉토리 총사용량 : $STO2" >> /tmp/$TERM.result
echo -e "t백업후, $MNT의 $HOST_$TERM 디렉토리 총사용량 : $STO4" >> /tmp/$TERM.result
}
########################################
# 보고서작성 함수 정의
########################################
report()
{
case $TERM in
month)
[ -s /tmp/$TERM.create ] && cat /tmp/$TERM.create >> /tmp/$TERM.result
print_storage
cat /tmp/$TERM.backup >> /tmp/$TERM.result;;
*)
[ -s /tmp/$TERM.create ] && cat /tmp/$TERM.create >> /tmp/$TERM.result
print_storage
if [ -s /tmp/$TERM.work ]
then
cat /tmp/$TERM.work >> /tmp/$TERM.result
cat /tmp/$TERM.backup >> /tmp/$TERM.result
if [ ! -s /tmp/$TERM.problem ]
then
echo -e "t$TERM 백업 결과 아무런 이상이 없습니다." >> /tmp/$TERM.result
else
echo -e "t$TERM 백업에 이상이 있는것 같습니다. 확인바랍니다" >> /tmp/$TERM.result
cat /tmp/$TERM.problem >> /tmp/$TERM.result
fi
fi;;
# *)
# print_header
# [ -s /tmp/$TERM.create ] && cat /tmp/$TERM.create >> /tmp/$TERM.result
# print_storage
#
# if [ -s /tmp/$TERM.backup ];
# then
# print_message backup
# print_result backup
# fi;;
esac
}
########################################
# 관리자에게 메일보내는 함수
########################################
mailto()
{
case $TERM in
month)
mail -s "[월간백업 결과 보고서] ($DATE2)" $ADMIN < /tmp/$TERM.result;;
week)
mail -s "[주간백업 결과 보고서] ($DATE2)" $ADMIN < /tmp/$TERM.result;;
day)
mail -s "[일일백업 결과 보고서] ($DATE2)" $ADMIN < /tmp/$TERM.result;;
esac
}
########################################
# 임시파일 삭제 함수
########################################
remove()
{
rm -f /tmp/$TERM.*
}
Copyright @2011 mediaon Corp. All rights reserved.