위로
아래
개요
쉘 스크립트로 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