• 맑음동두천 -8.4℃
  • 맑음강릉 -2.3℃
  • 맑음서울 -6.1℃
  • 맑음대전 -5.0℃
  • 맑음대구 -2.0℃
  • 맑음울산 -2.2℃
  • 구름많음광주 -0.5℃
  • 맑음부산 -1.1℃
  • 구름많음고창 -1.6℃
  • 제주 5.5℃
  • 맑음강화 -5.4℃
  • 맑음보은 -6.7℃
  • 맑음금산 -4.4℃
  • 구름많음강진군 1.3℃
  • 맑음경주시 -2.2℃
  • 맑음거제 -0.2℃
기상청 제공

programming

잡동사니 스크립트

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