위로 아래

개요

쉘 스크립트로 Daily Report 자동 작성

매일 해당 백업이 수행될 때 해당 쉘 스크립트도 같이 실행되도록 설정해서 매일 백업 report 문서를 생성

 

 

 

 

쉘 스크립트 생성

쉘 스크립트 만든 후 권한 수정해야함

chmod 755 [파일명]

 

권한 수정 전

 

권한 수정 후

 

 

 

 

NMC에 쉘 스크립트 등록

NMC에서 policy > Properties > Notifications

Send notification : On Completion 설정

Command : 쉘 스크립트 경로 설정

 

 

 

 


쉘 스크립트 내용

쉘 선언문

콘쉘로 작성

#!/usr/bin/ksh

 

 

PATH 설정

PATH=/usr/xpg4/bin:/bin:/usr/sbin:/usr/bin:/sbin:/opt/networker/bin:/usr/networker/bin:/usr/opt/networker/bin:/bin/nsr:/usr/ccs/bin:$PATH

 

 

시간 변수 설정

DATE=`date -d '-9 hour' '+%Y%m%d'`
# DATE 변수에 9시간 전의 년월일 숫자 대입 (9시간 전 시점의 보고서의 제목에 쓰일 것) ex) 20240724

TIME=`date '+%Y%m%d%H%M%S'`
# TIME 변수에 현재 날짜와 시간을 숫자로 나열 ex) 20240724221056

YEAR=`date -d '1 month ago' '+%Y'`
# YEAR 변수에 1달 전의 년도 대입 ex) 2024

MONTH=`date -d '1 month ago' '+%m'`
# MONTH 변수에 1달 전의 달 대입 ex) 06

 

디렉토리 변수 지정

YEAR_DIR=/nsr/REPORT/Daily_Group_Report/"$YEAR"
# YEAR_DIR 변수에 YEAR 변수를 넣은 경로를 저장

MONTH_DIR=/nsr/REPORT/Daily_Group_Report/"$YEAR"/"$MONTH"
# MONTH_DIR 변수에 MONTH 변수를 넣은 경로를 저장

 

파일 제목 변수 지정

LOG_TMP=/tmp/nsr_log.$$
# LOG_TMP 변수에 nsr_log 임시 파일 지정 ($$는 프로세스 ID값. 이번 프로세스로 tmp 디렉토리에 생성된 nsr_log.프로세스 ID 파일을 지정한 것)

LOG_IMSI=/tmp/mminfo_$TIME
# LOG_IMSI 변수에 mminfo_현재시간 파일 지정 (현재 시간에 tmp 디렉토리에 생성된 mminfo 파일을 지정한 것)

LOG=/nsr/REPORT/Daily_Group_Report/"$DATE"_Report.txt
# LOG 변수에 생성될 report 텍스트파일 제목 설정

LOG_Failed=/nsr/REPORT/Backup_Fail_Log/Backup_Fail_Log.txt
# LOG_Failed 변수에 백업 실패 시 생성할 텍스트 파일 제목 설정

 

 

보고서가 저장될 디렉토리 생성

if [ ! -d $YEAR_DIR ]
then
	mkdir -p $YEAR_DIR
fi
#위에서 구한 YEAR_DIR 경로에 디렉토리가 있는지 확인하고, 없으면 디렉토리 생성

if [ ! -d $MONTH_DIR ]
then
	mkdir -p $MONTH_DIR
fi
#위에서 구한 MONTH_DIR 경로에 디렉토리가 있는지 확인하고, 없으면 디렉토리 생성

 

 

이미 보고서 파일이 있으면 날짜에 맞는 디렉토리로 보고서 파일을 옮겨주기

ls -l /nsr/REPORT/Daily_Group_Report |grep -i $YEAR$MONTH |awk -v YEAR=$YEAR -v MONTH=$MONTH '{print "mv /nsr/REPORT/Daily_Group_Report/"$9 " /nsr/REPORT/Daily_Group_Report/"YEAR"/"MONTH"/"}' | sh


## 찢어서 살펴보기 ##
ls -l /nsr/REPORT/Daily_Group_Report |grep -i $YEAR$MONTH \
# Daily_Group_Report 안의 파일 중 오늘자 년월인 파일 목록 확인해서 테이블 형식으로 awk에 넘겨주기

|awk -v YEAR=$YEAR -v MONTH=$MONTH \
# awk에서 사용할 변수 중 YEAR에는 지금 년도, MONTH에는 지금 달 입력

'{print "mv /nsr/REPORT/Daily_Group_Report/"$9 " /nsr/REPORT/Daily_Group_Report/"YEAR"/"MONTH"/"}'\
# Daily_Group_Report 디렉토리에 오늘 날짜에 해당하는 파일이 있으면 그 파일을 YEAR/MONTH/ 디렉토리로 옮기기
# ($9가 ls -l로 봤을 때 9번째 열인 파일 이름이다)

| sh
#여러 파일이 있어서 여러 mv 명령어 모음이 출력되면, 이를 shell로 돌려서 실행한다

 

 

nsr_log.프로세스id 파일에 index를 제외한 로그 파일 문서 생성하기

cat | grep -v index > $LOG_TMP
# 뒤에서 표준 입력으로 받은 텍스트 중에 index를 포함한 열을 제거한 후 LOG_TMP 변수에 해당하는 파일로 저장한다


## 찢어서 살펴보기 ##

cat | grep -v index \
# 표준 입력으로 넘어온 값들 중에 index라는 문자를 포함하지 않은 값들만 출력

> $LOG_TMP
# cat이 출력한 내용을 위에서 지정한 LOG_TMP 파일에 해당 값을 넣어서 파일 생성하기

 

 

LOG_CREATE () 함수 작성

실제로 생성되는 report 파일에 내용을 쓰는 역할

 

백업 시작 시간과 백업에 걸린 시간 변수 생성

LOG_CREATE ()
# LOG_CREATE () 함수 작성

{
START_QTIME="$(cat $LOG_TMP | grep -i "Start time" | awk '{print $3,$4}'| xargs | awk '{print $1,$2}' | awk -F "time:" '{print $2}')"
SBACKUP_TIME="$(cat $LOG_TMP | grep "duration:" | awk -F "duration:" '{print $2}')"


## 자세히 뜯어보기 ##
START_QTIME=\
# START_QTIME 변수에 저장

"$(cat $LOG_TMP | grep -i "Start time" | awk '{print $3,$4}'| xargs \
# LOG_TMP 변수가 가르키는 파일 내용 중 대소문자 구별 없이 Start time이라는 문구를 포함한 행들의 3, 4열을 일자로 나열
# xargs : 텍스트를 한 줄로 정렬

| awk '{print $1,$2}' | awk -F "time:" '{print $2}')"
# 위에서 한 줄로 정렬된 문구 중 1, 2번 열의 필드만 추려서 time:으로 구분



SBACKUP_TIME="$(cat $LOG_TMP | grep "duration:" | awk -F "duration:" '{print $2}')"
# SBACKUP_TIME 변수에 LOG_TMP 변수에서 가리키는 파일 중 duration:을 포함하는 행을 duration:으로 구분하여 2번째 열을 출력해 저장

 

 

보고서에 사용할 변수들 생성

백업 사이즈, 클라이언트 이름, 백업 레벨(전체/증분)

mminfo의 결과를 대입

mminfo -av -q "sscreate>=$START_QTIME, group=$GROUP_NAME" -r "totalsize,client,level,name,sscomp(30)"\
|grep -v total|grep -v "index:" |grep -v "/dev/null" > $LOG_IMSI
# mminfo 내용을 출력. 출력 내역은 전체 사이즈, 클라이언트, 백업 레벨, saveset이름, 압축비율. 
# total과 index:와 /dev/null을 제외한 mminfo의 내역들만 LOG_IMSI 변수가 가리키는 파일에 저장.

BACKUP_SIZE=$(cat $LOG_IMSI | awk '{sum+=$1}END{print sum/1024/1024}')
# BACKUP_SIZE 변수에 위에서 만든 LOG_IMSI 파일 중 각 줄의 첫 번째 필드를 전부 더한 후, 덧셈이 끝나면 1024로 두 번 나눠서 MB 단위로 환산하여 저장

CLIENT_NAME=$(cat $LOG_IMSI | awk '{print $2}'|sort -u )
# CLIENT_NAME 변수에 LOG_IMSI 파일 중 2번째 열인 클라이언트 이름을 정렬하고 중복제거(-u)해서 저장

LEVEL_NAME=$(cat $LOG_IMSI | awk '{print $3}'|head -1)
# LEVEL_NAME 변수에 LOG_IMSI 파일 중 3번째 열인 백업 레벨을 첫번째 줄만 출력(head -1)하여 저장

 

 

시간을 알려주는 임시 파일을 생성 후, 추합하여  SEND_TIME2 변수 만들기

A=$(cat $LOG_IMSI |awk '{print $5,$6,$7,$8}'|sort -r |head -1)
# A 변수에 LOG_IMSI 파일 중 5,6,7,8 열의 값을 내림차순 정렬(최근 날짜가 가장 위)한 후 각 줄의 첫 행만 저장
# A 변수에 가장 최신 날짜와 시간 문자열을 저장

echo "date --date '"$A"' '+%m/%d/%y %T'" > /nsr/scripts/temp/date.txt
# A 변수에 저장된 날짜와 시간을 %m%d%y %T 형식으로 변환하는 명령어를 date.txt 파일에 입력

echo "cat /nsr/scripts/temp/date.txt | sh" |sh > /nsr/scripts/temp/date2.txt
# 위에서 만든 date.txt를 호출하여 쉘로 실행한 후, 그 결과를 date2.txt 파일에 저장

SEND_TIME2=`cat /nsr/scripts/temp/date2.txt`
# SEND_TIME2 변수에 date2.txt의 내용을 저장

 

 

클론 개수 세서, 없을 경우 N/A 출력

STATUS=$(cat $LOG_TMP | grep "Clone Start" | wc -l | awk '{print $1}')
# LOG_TMP 파일에서 Clone Start라는 문구를 추려서 행의 개수를 계산해 STATUS 변수에 저장

if [ $STATUS != 1 ]
then
        CLONE_TIME="N/A"
fi
# STATUS 변수가 1이 아닐 경우 CLONE_TIME 변수에 N/A 문구를 저장

 

 

표의 헤더 만들기

if [ ! -s $LOG ]
 then
  echo "    CLIENT_NAME      ,        GROUP_NAME         ,     START_TIME      ,       END_TIME      ,        ELAPSED_TIME          ,   STATUS   ,      Backup Size  ,LEVEL " > $LOG
  echo "---------------------,---------------------------,---------------------,---------------------,------------------------------,------------,-------------------,------" >> $LOG
fi

# LOG 변수의 파일 크기가 0보다 크지 않으면 (-s 옵션 : 파일의 크기가 0보다 큰지 확인)
# 표의 헤더를 출력해서 LOG 변수의 파일에 이어쓰기한다

 

 

LOG 변수에 데이터 입력

## Origin ##
printf "%-20s , %20s , %20s , %25s , %20s , %10s , %7.1f MB,%10s\n" "$CLIENT_NAME" "$GROUP_NAME" "$START_QTIME" "$SEND_TIME2" "$SBACKUP_TIME" "$BACKUP_STATUS" "$BACKUP_SIZE" "$LEVEL_NAME" >> $LOG

# %-20s : 문자열을 왼쪽 정렬하고 20칸의 공간 부여
# %20s : 문자열을 오른쪽 정렬하고 20칸의 공간 부여
# 7.1f : 소수점 아래 한자리까지 표시하고 7칸의 공간 부여
# 클라이언트 이름, 그룹 이름, 백업 시작 시간, 백업 종료 시간, 백업 소요 시간, 백업 상태, 백업된 데이터 크기, 백업 레벨을 출력해 LOG 변수의 파일에 이어쓰기


## Failed ## 
printf "%-20s , %20s , %20s , %25s , %20s , %10s , %7.1f MB,%10s\n" "$CLIENT_NAME" "$GROUP_NAME" "$START_QTIME" "$SEND_TIME2" "$SBACKUP_TIME" "$BACKUP_STATUS" "$BACKUP_SIZE" "$LEVEL_NAME" |grep -i Fail >> $LOG_Failed

# 위에서 fail이 포함된 것들만 따로 LOG_Failed 변수의 파일에 저장

}
# LOG_CREATE () 함수 끝

 

 

 

 

GROUP_SUMMARY () 함수 작성

 

GROUP_SUMMARY ()
# GROUP_SUMMARY () 함수 작성

{
GROUP_NAME="$(cat $LOG_TMP | grep "Workflow name:" | awk '{print $2}' | xargs | awk -F "name:" '{print $2}')"
# GROUP_NAME 변수에 LOG_TMP의 내용 중 Workflow name을 포함하는 행 중에서 2번째 필드를 추출해서
# 공백을 제거하고(xargs), name: 문자로 구분해서(awk -F), 순수하게 공백과 name: 없는 그룹 이름만 뽑아내기

STATUS=$(cat $LOG_TMP | grep "Total" | awk -F "Succeeded," '{print $2}' | grep "1 Failed." | wc -l | awk '{print $1}')
# LOG_TMP 파일 중 Total이 포함된 행에서 Succeeded를 제외하고 2열을 출력
# 1 Failed라고 쓰여 있는 행의 개수를 세서 STATUS 변수에 저장

if [ $STATUS = 1 ]
  then
    BACKUP_STATUS="FAIL"
  else
    BACKUP_STATUS="COMPLETE"
fi
# STATUS 변수의 값이 1이면 BACKUP_STATUS 변수에 FAIL을 저장
# STATUS 변수의 값이 1이 아니면 BACKUP_STATUS 변수에 COMPLETE를 저장


LOG_CREATE
# LOG_CREATE 함수를 호출

}
# GROUP_SUMMARY () 함수 끝

 

 

 

 

GROUP_FAIL () 함수 작성

GROUP_FAIL ()
# GROUP_FAIL () 함수 작성

{
GROUP_NAME="$(cat $LOG_TMP | grep "See group completion" | awk -F" completed, " '{print $1}' | awk -F") " '{print $2}')"
# GROUP_NAME 변수에 LOG_TMP 파일 중에서 See group completion 문구를 포함한 행들에 completed, 문구를 제거한 후 첫 열을 출력하고 ) 문구를 제거하고 2번째 열을 출력해 저장한다

BACKUP_STATUS="FAIL"
BACKUP_STATUS 변수에 FAIL 문구를 저장한다

LOG_CREATE
# LOG_CREATE 함수를 호출한다

}
# GROUP_FAIL () 함수 끝

 

 

결과 출력

BACKUP_ABORT 변수와 BACKUP_FAIL 변수의 값에 따라서 결과

BACKUP_ABORT=$(cat $LOG_TMP | grep "See group completion" | grep " aborted, " | wc -l | awk '{print $1}')
# BACKUP_ABORT 변수에 LOG_TMP 파일 중 See group completion 문구를 포함한 열 중 aborted, 문구를 포함한 열의 개수를 출력해 저장

BACKUP_FAIL=$(cat $LOG_TMP | grep "See group completion" | grep "Failed." | wc -l | awk '{print $1}')
# BACKUP_FAIL 변수에 LOG_TMP 파일 중 See group completion 문구를 포함한 열 중 Failed. 문구를 포함한 열의 개수를 출력해 저장

if [ $BACKUP_ABORT -eq 0 ] && [ $BACKUP_FAIL -eq 0 ]
  then
      GROUP_SUMMARY
  elif [ $BACKUP_ABORT -ne 0 ] && [ $BACKUP_FAIL -ne 0 ]
    then
      GROUP_ABORT
  elif [ $BACKUP_ABORT -eq 0 ] && [ $BACKUP_FAIL -ne 0 ]
    then
      GROUP_FAIL
fi

# BACKUP_ABORT가 0이고 BACKUP_FAIL이 0이면 GROUP_SUMMARY 호출
# BACKUP_ABORT가 0이 아니고 BACKUP_FAIL이 0이 아니면 GROUP_ABORT 호출
# BACKUP_ABORT가 0이고 BACKUP_FAIL이 0이 아니면 GROUP_FAIL 호출

 

 

rm -f $LOG_TMP
rm -f $LOG_IMSI

# 임시로 생성한 파일들 삭제

 

 

 

전체 내용

더보기

전체 내용

#!/usr/bin/ksh


PATH=/usr/xpg4/bin:/bin:/usr/sbin:/usr/bin:/sbin:/opt/networker/bin:/usr/networker/bin:/usr/opt/networker/bin:/bin/nsr:/usr/ccs/bin:$PATH

# DATE -9 Delay
DATE=`date -d '-9 hour' '+%Y%m%d'`
TIME=`date '+%Y%m%d%H%M%S'`
YEAR=`date -d '1 month ago' '+%Y'`
MONTH=`date -d '1 month ago' '+%m'`
YEAR_DIR=/nsr/REPORT/Daily_Group_Report/"$YEAR"
MONTH_DIR=/nsr/REPORT/Daily_Group_Report/"$YEAR"/"$MONTH"
LOG_TMP=/tmp/nsr_log.$$
LOG_IMSI=/tmp/mminfo_$TIME
LOG=/nsr/REPORT/Daily_Group_Report/"$DATE"_Report.txt
#LOG_BMS=/nsr/REPORT/Daily_Group_Report_BMS/"$DATE"_Report.txt
LOG_Failed=/nsr/REPORT/Backup_Fail_Log/Backup_Fail_Log.txt

if [ ! -d $YEAR_DIR ]
then
	mkdir -p $YEAR_DIR
fi

if [ ! -d $MONTH_DIR ]
then
	mkdir -p $MONTH_DIR
fi

ls -l /nsr/REPORT/Daily_Group_Report |grep -i $YEAR$MONTH |awk -v YEAR=$YEAR -v MONTH=$MONTH '{print "mv /nsr/REPORT/Daily_Group_Report/"$9 " /nsr/REPORT/Daily_Group_Report/"YEAR"/"MONTH"/"}' | sh

cat | grep -v index > $LOG_TMP

##### Backup Log Create #####
LOG_CREATE ()
{

START_QTIME="$(cat $LOG_TMP | grep -i "Start time" | awk '{print $3,$4}'| xargs | awk '{print $1,$2}' | awk -F "time:" '{print $2}')"
SBACKUP_TIME="$(cat $LOG_TMP | grep "duration:" | awk -F "duration:" '{print $2}')"

mminfo -av -q "sscreate>=$START_QTIME, group=$GROUP_NAME" -r "totalsize,client,level,name,sscomp(30)"|grep -v total|grep -v "index:" |grep -v "/dev/null" > $LOG_IMSI
BACKUP_SIZE=$(cat $LOG_IMSI | awk '{sum+=$1}END{print sum/1024/1024}')
CLIENT_NAME=$(cat $LOG_IMSI | awk '{print $2}'|sort -u )
LEVEL_NAME=$(cat $LOG_IMSI | awk '{print $3}'|head -1)
#SEND_TIME=$(cat $LOG_IMSI |awk '{print $5,$6,$7,$8}'|sort -r |head -1)


A=$(cat $LOG_IMSI |awk '{print $5,$6,$7,$8}'|sort -r |head -1)
echo "date --date '"$A"' '+%m/%d/%y %T'" > /nsr/scripts/temp/date.txt
echo "cat /nsr/scripts/temp/date.txt | sh" |sh > /nsr/scripts/temp/date2.txt
SEND_TIME2=`cat /nsr/scripts/temp/date2.txt`


STATUS=$(cat $LOG_TMP | grep "Clone Start" | wc -l | awk '{print $1}')
if [ $STATUS != 1 ]
then
        CLONE_TIME="N/A"
fi

if [ ! -s $LOG ]
 then
  echo "    CLIENT_NAME      ,        GROUP_NAME         ,     START_TIME      ,       END_TIME      ,        ELAPSED_TIME          ,   STATUS   ,      Backup Size  ,LEVEL " > $LOG
  echo "---------------------,---------------------------,---------------------,---------------------,------------------------------,------------,-------------------,------" >> $LOG
fi

## Origin ##
#printf "%-20s , %20s , %20s , %25s , %20s , %10s , %7.1f MB,%10s\n" "$CLIENT_NAME" "$GROUP_NAME" "$START_QTIME" "$SEND_TIME" "$SBACKUP_TIME" "$BACKUP_STATUS" "$BACKUP_SIZE" "$LEVEL_NAME" >> $LOG
printf "%-20s , %20s , %20s , %25s , %20s , %10s , %7.1f MB,%10s\n" "$CLIENT_NAME" "$GROUP_NAME" "$START_QTIME" "$SEND_TIME2" "$SBACKUP_TIME" "$BACKUP_STATUS" "$BACKUP_SIZE" "$LEVEL_NAME" >> $LOG

## Failed ## 
#printf "%-20s , %20s , %20s , %25s , %20s , %10s , %7.1f MB,%10s\n" "$CLIENT_NAME" "$GROUP_NAME" "$START_QTIME" "$SEND_TIME" "$SBACKUP_TIME" "$BACKUP_STATUS" "$BACKUP_SIZE" "$LEVEL_NAME" |grep -i Fail >> $LOG_Failed
printf "%-20s , %20s , %20s , %25s , %20s , %10s , %7.1f MB,%10s\n" "$CLIENT_NAME" "$GROUP_NAME" "$START_QTIME" "$SEND_TIME2" "$SBACKUP_TIME" "$BACKUP_STATUS" "$BACKUP_SIZE" "$LEVEL_NAME" |grep -i Fail >> $LOG_Failed



## BMS ##
#tail -1 $LOG | awk '{print $3}' | cut -d '_' -f 1 |sed s/-bak//g> /tmp/host.lst
#HOSTNAME=`cat /tmp/host.lst`
#printf "%-20s , %20s , %20s , %25s , %20s , %10s , %7.1f MB,%10s\n" "$CLIENT_NAME" "$GROUP_NAME" "$START_QTIME" "$SEND_TIME" "$SBACKUP_TIME" "$BACKUP_STATUS" "$BACKUP_SIZE" "$LEVEL_NAME" >> /nsr/REPORT/Daily_Group_Report_BMS/$HOSTNAME"_"$DATE

}

##### Backup Finish Summary #####
GROUP_SUMMARY ()
{
GROUP_NAME="$(cat $LOG_TMP | grep "Workflow name:" | awk '{print $2}' | xargs | awk -F "name:" '{print $2}')"
STATUS=$(cat $LOG_TMP | grep "Total" | awk -F "Succeeded," '{print $2}' | grep "1 Failed." | wc -l | awk '{print $1}')


if [ $STATUS = 1 ]
  then
    BACKUP_STATUS="FAIL"
  else
    BACKUP_STATUS="COMPLETE"
fi

LOG_CREATE
}


##### Backup Savepnpc Fail Summary #####
GROUP_FAIL ()
{
GROUP_NAME="$(cat $LOG_TMP | grep "See group completion" | awk -F" completed, " '{print $1}' | awk -F") " '{print $2}')"
BACKUP_STATUS="FAIL"

LOG_CREATE
}

##### Backup Status Query #####
BACKUP_ABORT=$(cat $LOG_TMP | grep "See group completion" | grep " aborted, " | wc -l | awk '{print $1}')
BACKUP_FAIL=$(cat $LOG_TMP | grep "See group completion" | grep "Failed." | wc -l | awk '{print $1}')

if [ $BACKUP_ABORT -eq 0 ] && [ $BACKUP_FAIL -eq 0 ]
  then
      GROUP_SUMMARY
  elif [ $BACKUP_ABORT -ne 0 ] && [ $BACKUP_FAIL -ne 0 ]
    then
      GROUP_ABORT
  elif [ $BACKUP_ABORT -eq 0 ] && [ $BACKUP_FAIL -ne 0 ]
    then
      GROUP_FAIL
fi

rm -f $LOG_TMP
rm -f $LOG_IMSI