하트위키
최근 변경
최근 토론
임의 문서
도구
최근 변경
GTV 서버 점검 스크립트
(r3 편집)
[오류!]
편집 권한이 부족합니다. 로그인된 사용자(이)여야 합니다. 해당 문서의
ACL 탭
을 확인하시기 바랍니다.
닫기
RAW 편집
[목차] == 개요 == KT GTV 서버 환경점검을 위해 사용하는 스크립트이다. 공통 점검 내역은 동일하게 수행하나 LSM/ADC 서버와 VOD 서버 역할이 달라 점검내용이 다른 부분이 있다. == 점검 스크립트 사용 방법 == 1. 아래 스크립트를 복사해 서버에 .sh 파일로 만들어 준다. > # vim Server_Check.sh 2. 스크립트 실행 권한을 부여 한다. > # chmod +x Server_Check.sh 3. 스크립트 수행 시 숫자 7과 해당 서버를 명시한다. > LSM 서버일 경우 [br] # ./Server_Check.sh 7 LSM > ADC 서버일 경우 [br] # ./Server_Check.sh 7 ADC > VOD 서버일 경우 [br] # ./Server_Check.sh 7 VOD == 스크립트 점검 결과 확인 == 스크립트 수행 후 모든 항목이 '''이상이 없다면''' 아래와 같이 출력된다. >... [br] 모든 항목이 이상없음 상태입니다. 스크립트 수행 후 점검 결과에 '''이상이 있다면''' 아래와 같이 출력된다. > [점검필요 항목] [br] 점검 내용 : NIC 사용 현황 [br] 상태: 점검필요 [br] [br] 점검 내용 : 시간동기화 확인 [br] 상태: 점검필요 [br] ... == 공통 점검 내역 == 1. HW 모델명 확인 2. HDD 및 RAID 구성, 상태 점검 3. 시스템 로그 점검 4. NIC 사용 현황 점검 5. Bond 및 IP 설정 점검 6. Routing 점검 7. OS 버전 점검 8. OS Disk 용량 점검 9. /data Disk 용량 점검 10. 시간동기화 점검 11. GateWay Ping 점검 12. 서버 부팅 관련 설정파일 점검 13. 프로세스 서비스 이중화 상태 점검 14. 프로세스 포트 및 상태 점검 15. CPU 사용률 점검 == LSM/ADC 서버 점검 내역 == 1. LBAdmin 상태 점검 2. LFMServer 로그 점검 3. LFMSinkModule 로그 점검 4. CiGLBServer 로그 점검 5. L_ADS 로그 점검 6. ADSController 로그 점검 7. ADSClient 로그 점검 8. LoadBalancer2 로그 점검 == VOD 서버 점검 내역 == 1. CIHVODServer 로그 점검 ==# 스크립트 본문 #== {{{ #!/bin/bash # -*- coding : UTF-8 -*- # version : 1.0.0 # create date : 2021-11-18 # update date : 2025-02-10 # ---------------------------------------------- # Copyright (c) 2021 # @author mir kim # Server_Check.sh scriptName="Server_Check.sh" scriptVersion="20250210" check_failures="" output_file="/home/castis/output_data_$(date +'%Y-%m-%d_%H-%M').txt" ENV=$(env | grep LANG) manPage=""" SYNOPSIS ./Server_Check.sh [?|-h] This script works as follows. 1. H/W 점검 결과 추출 2. Network 상태 점검 결과 추출 3. OS 상태 점검 결과 추출 4. 이중화 점검 결과 추출 5. 서비스 현황 점검 결과 추출 6. 종합의견 결과 추출 7. JSON 형식으로 반환 함수 Make_Json_List() parameter ex) Make_Json_List 생성유형 \"점검항목 큰 제목\" \"점검항목\" \"점검기준 값\" \"상세 점검 방법\" \"점검 결과 값\" \"양호/불량\" OPTIONS ? or -h Show this help message and exit """ #local functions start ServerName=$(hostname) # 점검 결과 Result Success="양호" Fail="불량" # server model Server_Product=$(dmidecode | grep Prod | head -1 | cut -d : -f2 | awk '{print $1, $2, $3, $4}') function f_Usage() { echo "$manPage" } Item_Num=1 function Make_Json_List() { # echo "DEBUG: 매개변수 -> $1 | $2 | $3 | $4 | $5 | $6" case $1 in First_Start) echo -e "--------------------------------------------" echo -e "점검 내용 : $3" echo -e "결과: $5" echo -e "상태: $6" echo -e "--------------------------------------------" ;; Start) echo -e "점검 내용 : $3" echo -e "결과: $5" echo -e "상태: $6" echo -e "--------------------------------------------" ;; Middle) echo -e "점검 내용 : $3" echo -e "결과: $5" echo -e "상태: $6" echo -e "--------------------------------------------" ;; End) echo -e "점검 내용 : $3" echo -e "결과: $5" echo -e "상태: $6" echo -e "--------------------------------------------" ;; First_Single) echo -e "점검 내용 : $3" echo -e "결과: $5" echo -e "상태: $6" echo -e "--------------------------------------------" ;; Single) echo -e "점검 내용 : $3" echo -e "결과: $5" echo -e "상태: $6" echo -e "--------------------------------------------" ;; esac } # H/W 점검 결과 추출 function HW_Check() { # [ H/W 모델명 확인 ] Make_Json_List First_Start "HardwareCheck" "H/W 모델명. 확인" "육안확인 결과" "dmidecode | grep 'Product Name'" "$(dmidecode | grep "Product Name" | head -1 | cut -d : -f2 | awk '{print $1, $2, $3, $4}')" "$Success" # [ HDD 용량 및 RAID 구성 점검] # Dell 서버 if [[ $Server_Product =~ "PowerEdge" ]]; then battery_status=$(omreport storage battery | grep "Status" | grep -v Ok) disk_status=$(omreport storage pdisk controller=0 | grep "Power Status" -v | grep -w Status | grep -v Ok) if [ -n "$battery_status" ] || [ -n "$disk_status" ]; then Make_Json_List Middle "" "Dell HDD상태 및 RAID 구성 점검" "Fail 또는 Error 있음" "omreport storage battery" "DISK, cache_battery 점검필요" "$Fail" else Make_Json_List Middle "" "Dell HDD상태 및 RAID 구성 점검" "Fail 또는 Error 없음" "omreport storage pdisk controller=0" "이상없음" "$Success" fi # Gen9 서버 elif [[ $Server_Product =~ "Gen9" ]]; then HP="hpssacli" # Gen10 서버 elif [[ $Server_Product =~ "Gen10" ]]; then HP="ssacli" # G8 이하 버전 HP 서버 else HP="hpacucli" fi # 여기서 if 문을 닫습니다. # HP 서버 if [ ! -z $HP ]; then cache_battery_status=$($HP ctrl all show config detail | egrep -i "Cache Status|controller status" | grep -i "Failed") for list in logicaldrive physicaldrive; do drive_check=$($HP ctrl all show config detail | grep -i "failed") case $? in 0) drive_check+=(${list}) ;; esac done if [ -n "$drive_check" ] || [ -n "$cache_battery_status" ]; then Make_Json_List Middle "" "HPE HDD 상태 및 RAID 구성 점검" "Fail 또는 Error 있음" "$HP ctrl all show detail" "DISK 또는 cache_battery 상태 점검필요" "$Fail" else Make_Json_List Middle "" "HPE HDD 상태 및 RAID 구성 점검" "Fail 또는 Error 없음" "$HP ctrl all show detail" "이상없음" "$Success" fi fi # [ 시스템 로그 점검] Syslog=$(grep -im 11 error /var/log/messages | egrep -vc "L2 Error|drive_cmd") if [ $Syslog -le 10 ]; then Make_Json_List Middle "" "시스템 로그 점검" "에러 없음" "grep -i Error /var/log/messages" "이상없음" "$Success" else Make_Json_List Middle "" "시스템 로그 점검" "에러 없음" "grep -i Error /var/log/messages" "점검필요" "$Fail" fi } # Network 상태 점검 결과 추출 function Network_Check() { # [ NIC 사용 현황] OS_Version=$(awk '{print $(NF-1)}' /etc/redhat-release) USE_Bond=$(ls -al /etc/sysconfig/network-scripts/ifcfg-bond* | egrep -w "ifcfg-bond0$|ifcfg-bond1$|ifcfg-bond2quot; -c 2>/dev/null) case $OS_Version in 6.4 | 6.6 | 6.9) Alias=$(grep -c 'alias bond' /etc/modprobe.d/bonding.conf) ;; 5 | 5.4 | 5.7) Alias=$(grep -c 'alias bond' /etc/modprobe.conf) ;; 7.5.1804) Alias=$(echo $USE_Bond) ;; esac case $USE_Bond in $Alias) Make_Json_List Start "NetworkCheck" "NIC 사용 현황" "-" "ethtool ethX\\\ncat /etc/modprobe.conf\\\ncat /etc/modprobe.d/bonding.conf" "이상없음" "$Success" ;; *) Make_Json_List Start "NetworkCheck" "NIC 사용 현황" "-" "ethtool ethX\\\ncat /etc/modprobe.conf\\\ncat /etc/modprobe.d/bonding.conf" "점검필요" "$Fail" ;; esac # [ IP 설정 확인] # vpc 사용 여부 ip addr show vpcmanage >/dev/null 2>/dev/null case $? in 0) Manage_IP=$(ip addr show vpcmanage | grep -w "inet" | cut -d'/' -f1 | awk '{ print $2 }') Service_IP=$(ip addr show vpcservice | grep -w "inet" | cut -d'/' -f1 | awk '{ print $2 }') Make_Json_List Middle "" "IP 설정 확인" "-" "ifconfig 명령으로 IP 설정 확인" "$Manage_IP\\\n$Service_IP" "$Success" ;; *) # bond2 사용 여부 ip addr show bond2 >/dev/null 2>/dev/null case $? in 0) Manage_IP=$(ip addr show bond0 | grep -w "inet" | cut -d'/' -f1 | awk '{ print $2 }' | head -1) Service1_IP=$(ip addr show bond1 | grep -w "inet" | cut -d'/' -f1 | awk '{ print $2 }' | head -1) Service2_IP=$(ip addr show bond2 | grep -w "inet" | cut -d'/' -f1 | awk '{ print $2 }' | head -1) Make_Json_List Middle "" "IP 설정 확인" "-" "ifconfig 명령으로 IP 설정 확인" "Manage_IP: $Manage_IP, Service1_IP: $Service1_IP, Service2_IP : $Service2_IP" "$Success" ;; *) Manage_IP=$(ip addr show bond0 | grep -w "inet" | cut -d'/' -f1 | awk '{ print $2 }' | head -1) Service_IP=$(ip addr show bond1 | grep -w "inet" | cut -d'/' -f1 | awk '{ print $2 }' | head -1) Make_Json_List Middle "" "IP 설정 확인" "-" "ifconfig 명령으로 IP 설정 확인" "$Manage_IP: $Manage_IP, Service_IP: $Service_IP" "$Success" ;; esac ;; esac # 관리 및 서비스 네트워크 Link 상태 점검 for list in $(grep "ONBOOT=yes" /etc/sysconfig/network-scripts/ifcfg-bond[0-9] | awk -F'ifcfg-' '{ split($2,arr,":"); print arr[1] }'); do case $list in bond1) # 후지쯔 서버 if [[ $Server_Product =~ "PRIMERGY" ]]; then NIC_Fail_Cnt=$(grep "$Active_NIC" /proc/net/bonding/bond1 -A 2 | grep Count | cut -d : -f2 | awk '{ if ( $1 >= 100 ){print}}' | wc -l) Active_NIC=$(grep "MASTER_SLAVE" /usr/local/castis/bfod/bfod.cfg | awk -F'=' '{ print $NF }') grep "$Active_NIC" /proc/net/bonding/${list} -A 2 | grep "Status" | grep -vq "up" Link_Status=$? else NIC_Fail_Cnt=$(grep Count /proc/net/bonding/$list | cut -d : -f2 | awk '{ if ( $1 >= 100 ){print}}' | wc -l) grep "Status" /proc/net/bonding/${list} | grep -vq "up" Link_Status=$? fi ;; *) NIC_Fail_Cnt=$(grep Count /proc/net/bonding/$list | cut -d : -f2 | awk '{ if ( $1 >= 100 ){print}}' | wc -l) grep "Status" /proc/net/bonding/${list} | grep -vq "up" Link_Status=$? ;; esac done # [ Routing 설정 점검] #bond2 존재 여부 src_Cnt=$(ip route show | grep "src" | wc -l) Static_IP_Cnt=$(grep "IPADDR" /etc/sysconfig/network-scripts/ifcfg-* | egrep -v "#|127.0.0.1" | wc -l) case $src_Cnt in $Static_IP_Cnt) Make_Json_List End "" "Routing 설정 점검" "" "route -n routing 정보 확인" "이상없음" "$Success" ;; *) Make_Json_List End "" "Routing 설정 점검" "" "route -n routing 정보 확인" "점검필요" "$Fail" ;; esac } # OS 상태 점검 결과 추출 function OS_Check() { OS_Limit_Space=70 L_Data_Limit_Space=90 V_Data_Limit_Space=92 # [ OS/Kerne 버전 ] OS_Version=$(awk -F 'release' '{ print $2 }' /etc/redhat-release | awk '{ print $(NF-1) }') Make_Json_List Start "OSCheck" "OS/Kernel 버전" "-" "cat /etc/redhat-release\\\n uname -a" "$OS_Version" "$Success" # [ OS_디스크 용량 점검] OS_Free_Space=$(df -h | grep -w "/" | awk '{ print $(NF-1) }' | cut -d'%' -f1) if [ $OS_Free_Space -lt $OS_Limit_Space ]; then Make_Json_List Middle "" "OS 디스크 용량 점검 - ( 마운트위치: / )" "${OS_Limit_Space}% 미만" "df -h 명령으로 / 의 사용률 확인" "이상없음" "$Success" else Make_Json_List Middle "" "OS 디스크 용량 점검 - ( 마운트위치: / )" "${OS_Limit_Space}% 미만" "df -h 명령으로 / 의 사용률 확인" "점검필요" "$Fail" fi # [ 스토리지_디스크 용량 점검] Data_Fail_Cnt=0 case $1 in LSM | ADC) for list in $(df -h | egrep "/data" | grep "%" | awk '{ print $NF }'); do if [ $(df -h | grep -w "$list" | awk '{ print $(NF-1) }' | cut -d'%' -f1) -gt $L_Data_Limit_Space ]; then ((Data_Fail_Cnt++)); fi done case $Data_Fail_Cnt in 0) Make_Json_List Middle "" "스토리지 디스크 용량 점검 - ( 마운트위치: /data? )" "${L_Data_Limit_Space}% 미만" "df -h 명령으로 각 /data?들의 사용률 확인" "이상없음" "$Success" ;; *) Make_Json_List Middle "" "스토리지 디스크 용량 점검 - ( 마운트위치: /data? )" "${L_Data_Limit_Space}% 미만" "df -h 명령으로 각 /data?들의 사용률 확인" "점검필요" "$Fail" ;; esac ;; VOD) if df -h | egrep -q "/data"; then for list in $(df -h | egrep "/data" | grep "%" | awk '{ print $NF }'); do if [ $(df -h | grep -w "$list" | awk '{ print $(NF-1) }' | cut -d'%' -f1) -gt $V_Data_Limit_Space ]; then ((Data_Fail_Cnt++)) fi done else # /data 디렉토리가 없으면 점검필요로 처리 Data_Fail_Cnt=1 fi case $Data_Fail_Cnt in 0) Make_Json_List Middle "" "스토리지 디스크 용량 점검 - ( 마운트위치: /data? )" "${V_Data_Limit_Space}% 미만" "df -h 명령으로 각 /data?들의 사용률 확인" "이상없음" "$Success" ;; *) Make_Json_List Middle "" "스토리지 디스크 용량 점검 - ( 마운트위치: /data? )" "${V_Data_Limit_Space}% 미만" "df -h 명령으로 각 /data?들의 사용률 확인" "점검필요" "$Fail" ;; esac ;; esac # [ 시간동기화 확인] ntpq -p | egrep -q '\+|\*' case $? in 0) Make_Json_List Middle "" "시간동기화 확인" "*220.73.142.71\\\n*220.73.142.73" "ntpq -p 명령으로 시간 동기화 동작 상태 확인" "이상없음" "$Success" ;; *) Make_Json_List Middle "" "시간동기화 확인" "*220.73.142.71\\\n*220.73.142.73" "ntpq -p 명령으로 시간 동기화 동작 상태 확인" "점검필요" "$Fail" ;; esac # GATEWAY PING 확인 ifconfig bond2 >/dev/null 2>/dev/null if [ $? -eq 0 ]; then Service_GW=($(ip route show | grep default -A 2 | grep "nexthop via" | awk -F'via ' '{ split($2,arr," "); print arr[1] }')) Service_Interface=($(ip route show | grep default -A 2 | grep "nexthop via" | awk -F'dev ' '{ split($2,arr," "); print arr[1] }')) else Service_GW=($(ip route show | grep default -A 2 | grep via | awk -F'via ' '{ split($2,arr," "); print arr[1] }')) Service_Interface=($(ip route show | grep default -A 2 | grep via | awk -F'dev ' '{ split($2,arr," "); print arr[1] }')) fi Service_GW_Result=0 for ((NIC_Cnt = 0; NIC_Cnt < ${#Service_GW[@]}; NIC_Cnt++)); do ping -I ${Service_Interface[$NIC_Cnt]} ${Service_GW[$NIC_Cnt]} -c 1 >/dev/null 2>/dev/null ((Service_GW_Result = $Service_GW_Result + $?)) done if [ $Service_GW_Result -eq 0 ]; then Make_Json_List Middle "" "GATEWAY_PING 확인" "정상" "ping '${Service_GW[*]}' (${Service_Interface[*]})" "이상없음" "$Success" else Make_Json_List Middle "" "GATEWAY_PING 확인" "정상" "ping '${Service_GW[*]}' (${Service_Interface[*]})" "점검필요" "$Fail" fi # [ 서버 부팅 시 스크립트 권한 확인, 고성능서버 설정 확인 등 ] sum_Result=() #crontab (파일 권한 및 소유자 확인) ls -l /etc/crontab | awk '{ print $1 }' | egrep -q "^-rw-" cron_Authority=$? ls -ltr /etc/crontab | awk '{ print $3 }' | grep -q "root" cron_Manager=$? if [ $cron_Authority -eq 0 ] && [ $cron_Manager -eq 0 ]; then cron_Result=0 else cron_Result=" cron " fi #sysctl.conf (파일에 해당 문자열이 있는지 확인인) grep -wq "TCP Setting by CASTIS" /etc/sysctl.conf sysctl_Result=$? if [ $sysctl_Result -ne 0 ]; then sysctl_Result=" sysctl "; fi #rc.local (심볼릭 링크 설정 확인인) ls -ltr /etc/rc.local | egrep "^lrwx" | awk '{ print $NF }' | egrep -q "rc.d/rc.local" rclocal_Authority=$? if [ $rclocal_Authority -ne 0 ]; then rclocal_Authority=" rclocal_Authority "; fi Omission_Ps=() case $1 in LSM | ADC) #AD node check echo $(hostname) | grep -wq "AD" AD_Check=$? case $AD_Check in 0) rc_local_Ps=("ServiceMonitorCtl" "NetIOCtl" "CiMonitoringAgentMonitor") ;; 1) rc_local_Ps=("ServiceMonitorCtl" "NetIOCtl" "LFMSinkModuleMonitor" "CiMonitoringAgentMonitor") ;; esac # share storage check grep -q "Virtual" /usr/local/castis/LoadBalancer2.cfg Share_Data_Result=$? if [ $Share_Data_Result -eq 0 ]; then rc_local_Ps+=("CenterFileManagerCtl"); fi ;; VOD) # share storage check grep -q "Shared_Base_Directory" /usr/local/castis/vod.cfg Share_Data_Result=$? rc_local_Ps=("ServiceMonitorCtl" "eStreamServer" "NetIOCtl" "ADMMonitor") if [ $Share_Data_Result -eq 0 ]; then rc_local_Ps+=("CenterFileWorkerCtl"); fi ;; esac for ((PS_Cnt = 0; PS_Cnt < ${#rc_local_Ps[@]}; PS_Cnt++)); do grep -v '#' /etc/rc.local | grep -q "${rc_local_Ps[$PS_Cnt]}" if [ $? -ne 0 ]; then Omission_Ps+=(${rc_local_Ps[$PS_Cnt]}); fi done for list in $cron_Result $sysctl_Result $rclocal_Authority; do if [ "$list" != "0" ]; then sum_Result+=($list); fi done if [ ! $sum_Result ] && [ ! $Omission_Ps ]; then Make_Json_List End "" "서버 부팅 시 스크립트 설정 누락 확인, 고성능 서버 설정 확인 등" "정상" "rc.local, crontab, sysctl.conf" "이상없음" "$Success" else Make_Json_List End "" "서버 부팅 시 스크립트 설정 누락 확인, 고성능 서버 설정 확인 등" "정상" "rc.local, crontab, sysctl.conf" "${sum_Result[*]} ${Omission_Ps[*]} 점검필요" "$Fail" fi } # 이중화 점검 function Cluster_Check() { #[ 프로세스 이중화 테스트 점검 ] grep -v "#" /usr/local/castis/svcmonitor.cfg | grep -q "Service1_My_Priority=0" # Master_Cnt = 1 : backup, 0: Active Master_Cnt=$? VIP_Up_Fail_Cnt=0 for V_IP in $(grep "Representative_NIC" /usr/local/castis/svcmonitor.cfg | grep -v "#" | cut -d '=' -f2 | sort -u); do ip addr show | grep -q "secondary ${V_IP}" if [ $? -ne 0 ]; then ((VIP_Up_Fail_Cnt++)); fi done case $VIP_Up_Fail_Cnt in 0) Make_Json_List Single "ClusterCheck" "프로세스 이중화 테스트 점검" "-" "LSM에서 실행 중이면 정상, ADC에서 실행중이면 절체로 판단" "이상없음" "$Success" return 0 ;; *) case $Master_Cnt in 0) Make_Json_List Single "ClusterCheck" "프로세스 이중화 테스트 점검" "-" "LSM에서 실행 중이면 정상, ADC에서 실행중이면 절체로 판단" "점검필요" "$Fail" return 1 ;; 1) Make_Json_List Single "ClusterCheck" "프로세스 이중화 테스트 점검" "-" "LSM에서 실행 중이면 정상, ADC에서 실행중이면 절체로 판단" "이상없음" "$Success" return 1 ;; esac ;; esac } # 서비스 현황 점검 Service_Solution_Status_Check() { DAY=$(date +%F) MONTH=$(date +%Y-%m) EVENTLOG_DAY=$(date +%Y%m%d) OS_Version=$(awk '{print $(NF-1)}' /etc/redhat-release) # LSM 포트 변수 정의 LFMServer_PORT="8549" LFMSinkModule_PORT="8550" LoadBalancer2_PORT="50890" ADSController_PORT="904" ADSClient_PORT="911" L_ADS_PORT="30000" L_GSDM_PORT="18079" L_NRM_PORT="18081" file_requester_PORT="18084" cache_manager_PORT="8081" NetIOServer3_PORT="32128" CiMonitoringAgent_PORT="30002" ServiceMonitor_PORT="3511" # VOD 포트 변수 정의 CiHVODServer_PORT="554" ADM_PORT="40080" ADS_PORT="30000" NetIOServer3_PORT="32128" cache_manager_PORT="8081" CiMonitoringAgent_PORT="30002" # LISTEN LISTEN_OUTPUT=$(netstat -tnpl | awk '/LISTEN/ {split($4, a, ":"); print a[length(a)]}' | sed 's/\/.*//g') # 누락된 항목을 저장할 변수 MISSING_ITEMS="" ISSUES_FOUND=0 # LSM과 VOD 구분하여 점검 case $1 in LSM) for PORT_LSM in ServiceMonitor_PORT LFMServer_PORT LFMSinkModule_PORT LoadBalancer2_PORT ADSController_PORT ADSClient_PORT L_ADS_PORT L_GSDM_PORT L_NRM_PORT file_requester_PORT cache_manager_PORT NetIOServer3_PORT CiMonitoringAgent_PORT; do PORT=${!PORT_LSM} if ! echo "$LISTEN_OUTPUT" | grep -qw "$PORT"; then MISSING_ITEMS+="$PORT_LSM($PORT), " TEMP_MISSING_ITEMS+="$PORT_LSM($PORT) " ISSUES_FOUND=1 printed_items[$PORT_LSM]=$PORT fi done sleep 3 for PORT_LSM in ServiceMonitor_PORT LFMServer_PORT LFMSinkModule_PORT LoadBalancer2_PORT ADSController_PORT ADSClient_PORT L_ADS_PORT L_GSDM_PORT L_NRM_PORT file_requester_PORT cache_manager_PORT NetIOServer3_PORT CiMonitoringAgent_PORT; do PORT=${!PORT_LSM} if ! echo "$LISTEN_OUTPUT" | grep -qw "$PORT"; then if [[ -z "${printed_items[$PORT_LSM]}" ]]; then MISSING_ITEMS+="$PORT_LSM($PORT), " ISSUES_FOUND=1 printed_items[$PORT_LSM]=$PORT fi fi done ;; ADC) for PORT_LSM in ServiceMonitor_PORT NetIOServer3_PORT CiMonitoringAgent_PORT; do PORT=${!PORT_LSM} if ! echo "$LISTEN_OUTPUT" | grep -qw "$PORT"; then MISSING_ITEMS+="$PORT_LSM($PORT), " TEMP_MISSING_ITEMS+="$PORT_LSM($PORT) " ISSUES_FOUND=1 printed_items[$PORT_LSM]=$PORT fi done sleep 3 for PORT_LSM in ServiceMonitor_PORT NetIOServer3_PORT CiMonitoringAgent_PORT; do PORT=${!PORT_LSM} if ! echo "$LISTEN_OUTPUT" | grep -qw "$PORT"; then if [[ -z "${printed_items[$PORT_LSM]}" ]]; then MISSING_ITEMS+="$PORT_LSM($PORT), " ISSUES_FOUND=1 printed_items[$PORT_LSM]=$PORT fi fi done ;; VOD) # VOD 포트 점검 for PORT_VOD in CiHVODServer_PORT ADM_PORT ADS_PORT NetIOServer3_PORT cache_manager_PORT CiMonitoringAgent_PORT; do PORT=${!PORT_VOD} if ! echo "$LISTEN_OUTPUT" | grep -qw "$PORT"; then MISSING_ITEMS+="$PORT_LSM($PORT), " TEMP_MISSING_ITEMS+="$PORT_LSM($PORT) " ISSUES_FOUND=1 printed_items[$PORT_LSM]=$PORT fi done sleep 3 for PORT_VOD in CiHVODServer_PORT ADM_PORT ADS_PORT NetIOServer3_PORT cache_manager_PORT CiMonitoringAgent_PORT; do PORT=${!PORT_VOD} if ! echo "$LISTEN_OUTPUT" | grep -qw "$PORT"; then if [[ -z "${printed_items[$PORT_LSM]}" ]]; then MISSING_ITEMS+="$PORT_LSM($PORT), " ISSUES_FOUND=1 printed_items[$PORT_LSM]=$PORT fi fi done ;; esac # 결과 출력 if [ $ISSUES_FOUND -eq 0 ]; then Make_Json_List Single "ServiceCheck" " 포트 및 프로그램 상태 확인" "모두 LISTEN 상태" "netstat 명령으로 포트 및 프로그램 확인" "이상없음" "$Success" else MISSING_ITEMS_STR=${MISSING_ITEMS%, } Make_Json_List Single "ServiceCheck" " 포트 및 프로그램 상태 확인" "LISTEN 확인 실패: $MISSING_ITEMS_STR" "netstat 명령으로 포트 및 프로그램 확인" "$MISSING_ITEMS_STR 점검필요" "$Fail" fi # CPU 사용률 확인 VMSTAT=$(vmstat 1 3 | awk '{print $15}' | sed -n 4p) if [ "$1" != "VOD" ] && [ $2 -ne 0 ]; then if [ $VMSTAT -ge 30 ]; then Make_Json_List Single "ServiceCheck" "CPU 사용률 확인" "30% 이상" "vmstat 명령으로 CPU id(idle) 확인" "이상없음" "$Success" else Make_Json_List Single "ServiceCheck" "CPU 사용률 확인" "30% 이상" "vmstat 명령으로 CPU id(idle) 확인" "불량" "$Fail" fi else if [ $VMSTAT -ge 30 ]; then Make_Json_List Start "ServiceCheck" "CPU 사용률 확인" "30% 이상" "vmstat 명령으로 CPU id(idle) 확인" "이상없음" "$Success" else Make_Json_List Start "ServiceCheck" "CPU 사용률 확인" "30% 이상" "vmstat 명령으로 CPU id(idle) 확인" "불량" "$Fail" fi fi # LBADMIN 상태 확인, 로그 기반 장애 내역 점검 if [ "$1" != "VOD" ]; then if [ $2 -eq 0 ]; then Server_Error_Cnt=$(/usr/local/castis/tools/vodcmd all status | grep "Error" | awk '{ print $1 }' | xargs echo) if [ -z "$Server_Error_Cnt" ]; then Make_Json_List Middle "" "LBAdmin 상태 확인" "-" "LBAdmin에서 LB서버 상태 확인 ( Running, Pause, Error )" "이상없음" "$Success" else Make_Json_List Middle "" "LBAdmin 상태 확인" "-" "LBAdmin에서 LB서버 상태 확인 ( Running, Pause, Error )" "${Server_Error_Cnt} 점검필요" "$Fail" fi LFM_DIST_LOG1=0 LFM_DIST_LOG2=0 GLB_LIMIT="30" LB_EVENT_LIMIT="30" LB_CI_LIMIT="30" LFM_EVENT_LIMIT="30" LFM_CI_LIMIT="30" LFMSINK_LIMIT="30" LNRM_LIMIT=30 LGSDM_LIMIT=30 ADS_LIMIT=30 ADC_LIMIT=30 ADSCONTROLLER_LIMIT=30 UNIXTIME_20=$(date +%s -d '20 minute ago') #OTV if [ $OS_Version == "7.5.1804" ]; then #CiGLBServer if [ -d /var/log/castis/glb_log ]; then LOG_FILE=$(ls -ltr /var/log/castis/glb_log/GLB.log 2>/dev/null) if [ ! -f "$LOG_FILE" ]; then Make_Json_List Middle "" "CiGLBServer 동작 확인" "LOG 파일 없음" "CiGLBServer: $LOG_FILE 파일 없음" "GLB 로그파일 여부 점검필요" "$Fail" else GLB_CI_LOG=$(egrep -ic "error|Fail" "$LOG_FILE") if [ "$GLB_CI_LOG" -ge "$GLB_LIMIT" ]; then Make_Json_List Middle "" "CiGLBServer 동작 확인" "Fail 또는 Error 있음" "CiGLBServer: $LOG_FILE 'error|fail'" "점검필요" "$Fail" else Make_Json_List Middle "" "CiGLBServer 동작 확인" "Fail 또는 Error 없음" "CiGLBServer: $LOG_FILE 'error|fail'" "이상없음" "$Success" fi fi else Make_Json_List Middle "" "CiGLBServer 동작 확인" "디렉터리 없음" "CiGLBServer: /var/log/castis/glb_log 디렉터리 없음" "디렉터리 여부 점검필요" "$Fail" fi #LoadBalancer2 if [ -d /var/log/castis/lb_log ]; then LOG_FILES="/var/log/castis/lb_log/LoadBalancer2.log 2>/dev/null" if [ -z "$LOG_FILES" ]; then Make_Json_List End "" "LoadBalancer2 동작 확인" "LOG 파일 없음" "LoadBalancer2: /var/log/castis/lb_log 파일 없음" "LoadBalancer2.log 로그파일 여부 점검필요" "$Fail" else LB_CI_LOG=$(egrep -i "error|Fail" $LOG_FILES | grep -vc "LimitCacheContent list" | awk -F':' '{ sum += $2 } END { print sum }') LB_EVENT_LOG=$(egrep -ic "error|Fail" /var/log/castis/lb_log/EventLog[$EVENTLOG_DAY].log 2>/dev/null || echo 0) if [ $LB_CI_LOG -ge $LB_CI_LIMIT ] || [ $LB_EVENT_LOG -ge $LB_EVENT_LIMIT ]; then Make_Json_List End "" "LoadBalancer2 동작 확인" "Fail 또는 Error 있음" "LoadBalancer2: /var/log/castis/lb_log/LoadBalancer2.log 'error|fail'" "LoadBalancer2.log 점검필요" "$Fail" else Make_Json_List End "" "LoadBalancer2 동작 확인" "Fail 또는 Error 없음" "LoadBalancer2: /var/log/castis/lb_log/LoadBalancer2.log 'error|fail'" "이상없음" "$Success" fi fi else Make_Json_List End "" "LoadBalancer2 동작 확인" "디렉터리 없음" "LoadBalancer2: /var/log/castis/lb_log 디렉터리 없음" "디렉터리 여부 점검필요" "$Fail" fi else #LFMServer if [ -d /var/log/castis/lfm_log ]; then # 최근 LFMServer.log" 파일 5개 선택택 LOG_FILES=$(ls /var/log/castis/lfm_log/$MONTH/${DAY}* | tail -5 | awk '{ print $NF }' 2>/dev/null) if [ -z "$LOG_FILES" ]; then Make_Json_List Middle "" "LFMServer 동작 확인" "LOG 파일 없음" "LFMServer: /var/log/castis/lfm_log/LFMServer.log" "LFMServer.log 로그파일 여부 점검필요" "$Fail" else # 선택된 파일에서 에러와 실패 패턴 검색 LFM_CI_LOG=$(egrep -v "Infor|match|Source file" $LOG_FILES | egrep -ic "error|Fail" 2>/dev/null) if [ $LFM_CI_LOG -ge $LFM_CI_LIMIT ]; then Make_Json_List Middle "" "LFMServer 동작 확인" "Fail 또는 Error 있음" "LFMServer: /var/log/castis/lfm_log/LFMServer.log 'error|fail'" "LFMServer.log 점검필요" "$Fail" else Make_Json_List Middle "" "LFMServer 동작 확인" "Fail 또는 Error 없음" "LFMServer: /var/log/castis/lfm_log/LFMServer.log 'error|fail'" "이상없음" "$Success" fi fi else Make_Json_List Middle "" "LFMServer 동작 확인" "디렉터리 없음" "LFMServer: /var/log/castis/lfm_log 디렉터리 없음" "디렉터리 여부 점검필요" "$Fail" fi # LFMSinkModule if [ -d /var/log/castis/lfmsinkmodule_log ]; then # 최근 LFMSinkModule.log 파일 5개 선택 LOG_FILES=$(ls /var/log/castis/lfmsinkmodule_log/${MONTH}/${DAY}* | tail -5 | awk '{ print $NF }' 2>/dev/null) if [ -z "$LOG_FILES" ]; then Make_Json_List Middle "" "LFMSinkModule 동작 확인" "LOG 파일 없음" "LFMSinkModule: /var/log/castis/lfmsinkmodule_log/LFMSinkModule.log" "LFMSinkModule.log 로그파일 여부 점검필요" "$Fail" else LFMSINKMODULE_LOG=$(egrep -ic "error|Fail" $LOG_FILES) if [ $LFMSINKMODULE_LOG -ge $LFMSINK_LIMIT ]; then Make_Json_List Middle "" "LFMSinkModule 동작 확인" "Fail 또는 Error 있음" "LFMSinkModule: /var/log/castis/lfmsinkmodule_log/LFMSinkModule.log 'error|fail'" "LFMSinkModule.log 점검필요" "$Fail" else Make_Json_List Middle "" "LFMSinkModule 동작 확인" "Fail 또는 Error 없음" "LFMSinkModule: /var/log/castis/lfmsinkmodule_log/EventLog.log 'error|fail'" "이상없음" "$Success" fi fi else Make_Json_List Middle "" "LFMSinkModule 동작 확인" "디렉터리 없음" "LFMSinkModule: /var/log/castis/lfmsinkmodule_log 디렉터리 없음" "디렉터리 여부 점검필요" "$Fail" fi # CiGLBServer if [ -d /var/log/castis/glb_log ]; then LOG_FILE="/var/log/castis/glb_log/GLB.log" if [ -z "$LOG_FILES" ]; then Make_Json_List Middle "" "CiGLBServer 동작 확인" "LOG 파일 없음" "CiGLBServer: $LOG_FILE 파일 없음" "GLB 로그파일 여부 점검필요" "$Fail" else GLB_CI_LOG=$(egrep -ic "error|Fail" $LOG_FILES) if [ $GLB_CI_LOG -ge $GLB_LIMIT ]; then Make_Json_List Middle "" "CiGLBServer 동작 확인" "Fail 또는 Error 없음" "CiGLBServer: /var/log/castis/glb_log/EventLog.log 'error|fail'" "점검필요" "$Fail" else Make_Json_List Middle "" "CiGLBServer 동작 확인" "Fail 또는 Error 없음" "CiGLBServer: /var/log/castis/glb_log/EventLog.log 'error|fail'" "이상없음" "$Success" fi fi else Make_Json_List Middle "" "CiGLBServer 동작 확인" "디렉터리 없음" "CiGLBServer: /var/log/castis/glb_log 디렉터리 없음" "디렉터리 여부 점검필요" "$Fail" fi # L_ADS if [ -d /var/log/castis/L_ads_log ]; then LOG_FILES=$(ls /var/log/castis/L_ads_log/${MONTH}/${DAY}* 2>/dev/null) if [ -z "$LOG_FILES" ]; then Make_Json_List Middle "" "L_ADS 동작 확인" "LOG 파일 없음" "L_ADS: /var/log/castis/L_ads_log/EventLog.log" "Event 로그파일 여부 점검필요" "$Fail" else ADS_LOG=$(egrep -v "Infor" $LOG_FILES | egrep -ic "error|Fail") if [ $ADS_LOG -ge $ADS_LIMIT ]; then Make_Json_List Middle "" "L_ADS 동작 확인" "Fail 또는 Error 없음" "L_ADS: /var/log/castis/L_ads_log/EventLog.log 'error|fail'" "점검필요" "$Fail" else Make_Json_List Middle "" "L_ADS 동작 확인" "Fail 또는 Error 없음" "L_ADS: /var/log/castis/L_ads_log/EventLog.log 'error|fail'" "이상없음" "$Success" fi fi else Make_Json_List Middle "" "L_ADS 동작 확인" "디렉터리 없음" "L_ADS: /var/log/castis/L_ads_log 디렉터리 없음" "디렉터리 여부 점검필요" "$Fail" fi # ADSController if [ -d /var/log/castis/adscontroller_log ]; then LOG_FILES=$(ls /var/log/castis/adscontroller_log/$MONTH/${DAY}* 2>/dev/null) if [ -z "$LOG_FILES" ]; then Make_Json_List Middle "" "ADSController 동작 확인" "LOG 파일 없음" "ADSController: /var/log/castis/adscontroller_log/EventLog.log" "Event 로그파일 여부 점검필요" "$Fail" else ADSCONTROLLER_LOG=$(egrep -v "Infor" $LOG_FILES | egrep -ic "error|Fail") if [ $ADSCONTROLLER_LOG -ge $ADSCONTROLLER_LIMIT ]; then Make_Json_List Middle "" "ADSController 동작 확인" "Fail 또는 Error 없음" "ADSController: /var/log/castis/adscontroller_log/EventLog.log 'error|fail'" "EventLog.log 점검필요" "$Fail" else Make_Json_List Middle "" "ADSController 동작 확인" "Fail 또는 Error 없음" "ADSController: /var/log/castis/adscontroller_log/EventLog.log 'error|fail'" "이상없음" "$Success" fi fi else Make_Json_List Middle "" "ADSController 동작 확인" "디렉터리 없음" "ADSController: /var/log/castis/adscontroller_log 디렉터리 없음" "디렉터리 여부 점검필요" "$Fail" fi # ADSClient if [ -d /var/log/castis/adc_log ]; then LOG_FILES=$(ls /var/log/castis/adc_log/$MONTH/${DAY}* 2>/dev/null) if [ -z "$LOG_FILES" ]; then Make_Json_List Middle "" "ADSClient 동작 확인" "LOG 파일 없음" "ADSClient: /var/log/castis/adc_log/ADSClient.log " "ADSClient.log 로그파일 여부 점검필요" "$Fail" else ADC_LOG=$(egrep -v "Infor" $LOG_FILES | egrep -ic "error|Fail") if [ $ADC_LOG -ge $ADC_LIMIT ]; then Make_Json_List Middle "" "ADSClient 동작 확인" "Fail 또는 Error 없음" "ADSClient: /var/log/castis/adc_log/EADSClient.log 'error|fail'" "ADSClient.log 점검필요" "$Fail" else Make_Json_List Middle "" "ADSClient 동작 확인" "Fail 또는 Error 없음" "ADSClient: /var/log/castis/adc_log/ADSClient.log 'error|fail'" "이상없음" "$Success" fi fi else Make_Json_List Middle "" "ADSClient 동작 확인" "디렉터리 없음" "ADSClient: /var/log/castis/adc_log 디렉터리 없음" "디렉터리 여부 점검필요" "$Fail" fi # LoadBalancer2 if [ -d /var/log/castis/lb_log ]; then LOG_FILES="/var/log/castis/lb_log/LoadBalancer2.log" if [ -z "$LOG_FILES" ]; then Make_Json_List End "" "LoadBalancer2 동작 확인" "LOG 파일 없음" "LoadBalancer2: /var/log/castis/lb_log/LoadBalancer2.log" "LoadBalancer2.log 로그파일 여부 점검필요" "$Fail" else LB_CI_LOG=$(egrep -i "error|Fail" $LOG_FILES | grep -vc "LimitCacheContent list") LB_EVENT_LOG=$(egrep -ic "error|Fail" /var/log/castis/lb_log/EventLog[$EVENTLOG_DAY].log 2>/dev/null || echo 0) if [ $LB_CI_LOG -ge $LB_CI_LIMIT ]; then Make_Json_List End "" "LoadBalancer2 동작 확인" "Fail 또는 Error 있음" "LoadBalancer2: /var/log/castis/lb_log/LoadBalancer2.log 'error|fail'" "LoadBalancer2.log 점검필요" "$Fail" else Make_Json_List End "" "LoadBalancer2 동작 확인" "Fail 또는 Error 없음" "LoadBalancer2: /var/log/castis/lb_log/LoadBalancer2.log 'error|fail'" "이상없음" "$Success" fi fi else Make_Json_List End "" "LoadBalancer2 동작 확인" "디렉터리 없음" "LoadBalancer2: /var/log/castis/lb_log 디렉터리 없음" "디렉터리 여부 점검필요" "$Fail" fi fi fi else VOD_LIMIT=50 NOMEDIA_RESET_LOG_LIMIT=200000 if [ -e "/var/log/castis/vod_log/EventLog[$EVENTLOG_DAY].log" ]; then EVENT_VOD_NOMEDIA_RESET_LOG=$(grep "No Media" $(ls -ltr /var/log/castis/vod_log/${MONTH}/${DAY}* | awk '{ print $NF }') | grep ted | awk -F '[' '{ split($2,arr,"]"); sum+=arr[1] } END{print sum}') EVENT_VOD_ERR_LOG=$(egrep -i "Error|Fail|Invalid File.*mpg" /var/log/castis/vod_log/EventLog[$EVENTLOG_DAY].log | egrep -v "OnHTTPGet Fail|Invalid URL. SETUP Fail|RTSP Message Parsing Error|Invalid|AsyncIO Error" | wc -l) else EVENT_VOD_NOMEDIA_RESET_LOG=0 EVENT_VOD_ERR_LOG=0 fi i=0 if [ $EVENT_VOD_ERR_LOG -ge $VOD_LIMIT ]; then Service_Streaming_Status_Array[$i]="VOD ERROR로그 $VOD_LIMIT건 이상 발생" ((i++)) fi if [ $EVENT_VOD_NOMEDIA_RESET_LOG -ge $NOMEDIA_RESET_LOG_LIMIT ]; then Service_Streaming_Status_Array[$i]="VOD No Media로그 $EVENT_VOD_NOMEDIA_RESET_LOG건 이상 발생" fi 2>/dev/null if [ ${#Service_Streaming_Status_Array[@]} -ge 1 ]; then Make_Json_List End "" "CIHVODServer 동작 확인" "Fail 또는 Error 없음" "'No Media|error|fail'" "${Service_Streaming_Status_Array[@]}" "$Fail" else Make_Json_List End "" "CIHVODServer 동작 확인" "Fail 또는 Error 없음" "'No Media|error|fail'" "이상없음" "$Success" fi fi } #local functions end case $1 in \? | -h) f_Usage exit ;; esac #Json start case $2 in LSM | ADC) HW_Check Network_Check OS_Check $2 Cluster_Check Service_Solution_Status_Check $2 $? hw_result=$(HW_Check) network_result=$(Network_Check) os_result=$(OS_Check $2) cluster_result=$(Cluster_Check) service_solution_result=$(Service_Solution_Status_Check $2 $?) all_results="$hw_result\n$network_result\n$os_result\n$cluster_result\n$service_solution_result" ;; VOD) HW_Check Network_Check OS_Check $2 Service_Solution_Status_Check $2 hw_result=$(HW_Check) network_result=$(Network_Check) os_result=$(OS_Check $2) service_result=$(Service_Solution_Status_Check $2) all_results="$hw_result\n$network_result\n$os_result\n$service_result" ;; esac # 결과 중 "점검필요", "불량", "이상 발생" 텍스트가 있어야 수집 if echo -e "$all_results" | grep -E -q "점검필요|불량|이상 발생"; then echo -e "\n[점검필요 항목]" echo -e "$all_results" | grep -E -q "점검필요|불량|이상 발생" echo -e "$all_results" | awk '/점검 내용/ {content=$0} /상태:/ && /점검필요/ {print content; print $0; print ""}' else echo -e "\n모든 항목이 이상없음 상태입니다." fi }}}
Liberty
|
the tree