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.* }