본문 바로가기
투윤아빠의 올IT

리눅스 web/was 체크 스크립트(apache, tomcat)

by 별다방김샘 2023. 11. 23.
반응형

리눅스 시스템에서 web/was 인스턴스 체크를 하기 위한 쉘 스크립트 입니다. 사용하는 시스템에 맞게 수정해서 사용하면 도움이 될것 같습니다. 본 스크립트는 하나의 리눅스 시스템에 apache와 tomcat이 연동되어 구성되어 있는 환경에서 작성한 것으로 본인이 환경에 맞게 응용해서 사용 하시면 좋을 것 같습니다.

 

리눅스리눅스

 

목차

  • 1. PSEF_CODE 함수
  • 2. GREP_PROC 함수
  • 3. ChkOK 함수
  • 4. ChkProcCnt 함수
  • 5. CntIP 함수
  • 6. ChkListenPort 함수
  • 7. 스크립트 실행부
  • 8. 결과
  • 9. 전체소스

     

    1. PSEF_CODE 함수

    function PSEF_CODE {
        # 1.1.0
        if [ $# -eq 0 ]; then
            # 현재 프로세스 목록에서 'ps -ef'와 'grep -iy'를 필터링하는 부분입니다.
            ps -ef | grep -iyv "ps -ef" | grep -v "grep -iy"
        else
            case $1 in
                PID)
                    shift
                    # 재귀적으로 PSEF_CODE 함수를 호출하고, 결과에서 프로세스 ID만 추출합니다.
                    PSEF_CODE $* | awk '{print $2}'
                    ;;
                USER)
                    shift
                    USERNAME="$1"; shift
                    # 재귀적으로 PSEF_CODE 함수를 호출하고, 사용자명에 대소문자 무시 조건을 적용합니다.
                    PSEF_CODE $* | awk -v USERNAME=$USERNAME 'tolower($1) == tolower(USERNAME)'
                    ;;
                PROC)
                    shift
                    STR="$1"; shift
                    # 재귀적으로 PSEF_CODE 함수를 호출하고, 지정된 프로세스 이름에 대소문자 무시로 검색합니다.
                    PSEF_CODE $* | grep -iy "$STR"
                    ;;
                COUNT)
                    shift
                    # 재귀적으로 PSEF_CODE 함수를 호출하고, 결과의 라인 수를 세어줍니다.
                    PSEF_CODE $* | wc -l
                    ;;
            esac
        fi
    }

     

    awk 명령어를 사용하여 프로세스 목록을 필터링하고, 대소문자 무시를 적용하여 일치하는 결과를 반환.

     

     

     

    2. GREP_PROC 함수

    function GREP_PROC {
        # version 1.3.0
        PID_OPT=""
        USER_OPT=""
        USER_NAME=""
        while [ $# -gt 0 ]; do
            case $1 in
                -c)
                    shift
                    # COUNT 옵션을 CMD_LIST에 추가합니다.
                    CMD_LIST="COUNT ${CMD_LIST}"
                    ;;
                -P)
                    shift
                    # PID 옵션을 CMD_LIST에 추가합니다.
                    CMD_LIST="PID ${CMD_LIST}"
                    ;;
                -u)
                    shift
                    USERNAME=$1; shift
                    # USER 옵션을 CMD_LIST에 추가하고, 사용자명을 함께 기록합니다.
                    CMD_LIST="${CMD_LIST} USER $(USERNAME)"
                    ;;
                *)
                    # 나머지 옵션은 PROC로 간주하고 CMD_LIST에 추가합니다.
                    CMD_LIST="${CMD_LIST} PROC $1"
                    shift
                    ;;
            esac
        done
        # CMD_LIST에 있는 PID와 COUNT의 순서를 바꿔줍니다.
        CMD_LIST=$(echo $CMD_LIST | sed 's/PID COUNT/COUNT PID/g')
        # 최종적으로 PSEF_CODE 함수를 호출하여 결과를 반환합니다.
        PSEF_CODE ${CMD_LIST}
    }

     

    스크립트 옵션에 따라 CMD_LIST에 적절한 옵션을 추가하고, 이를 PSEF_CODE 함수에 전달 합니다.

     

     

     

     

    3. ChkOK 함수

    function ChkOK {
        # 1.0.0
        PARAM_MSG="$1"; shift
        RESULT=$1; shift
        RESULT_LIMIT_LOW=$1; shift
        RESULT_LIMIT_HIGH=$1; shift
        MSG="$@"
        printf "${PARAM_MSG} : "
        # 주어진 조건에 따라 결과를 판단하여 메시지를 출력합니다.
        [ ${RESULT} -ge ${RESULT_LIMIT_LOW} -a ${RESULT} -le ${RESULT_LIMIT_HIGH} ] && echo "[ OK ]" || echo "[ FAIL : ${MSG} ]"
    }

     

    결과를 평가하고 메시지를 출력하는 로직 입니다.

     

     

     

     

    4. ChkProcCnt 함수

    function ChkProcCnt {
        # 1.1.0
        OWNER="$1"; shift
        PROC="$1"; shift
        SUB_PROC="$1"; shift
        CNT_MIN=$1; shift
        CNT_MAX=$1; shift
        printf "${PROC}(${SUB_PROC}) : "
        # PSEF_CODE 함수를 사용하여 프로세스 카운트를 가져오고, 주어진 범위 내에 있는지 확인합니다.
        PROC_CNT=$(PSEF_CODE COUNT USER ${OWNER} PROC "${PROC}" PROC "${SUB_PROC}")
        [ ${PROC_CNT} -ge ${CNT_MIN} -a ${PROC_CNT} -le ${CNT_MAX} ] && echo "[ OK ]" || echo "[ FAIL : Process count out of range ]"
    }

     

    PSEF_CODE 함수를 사용하여 프로세스 카운트를 가져오고, 주어진 범위 내에 있는지 확인 합니다.

     

     

     

     

    5. CntIP 함수

    function CntIP {
        # usage: CntIP IP
        IP=$1
        # ifconfig 결과에서 해당 IP를 찾아서 라인 수를 세어 반환합니다.
        echo $(ifconfig -a | grep -iy " ${IP} " | grep -v "grep -iy" | wc -l)
    }

    ifconfig 결과에 해당 IP를 찾아서 라인 수를 세어 반환 합니다.

     

     

     

     

    6. ChkListenPort 함수

    function ChkListenPort {
        NAME=$1; shift
        PORT=$1; shift
        MSG=$*
        printf "Listening Port (${NAME}:${PORT}) : "
        # netstat 결과에서 LISTEN 상태인 해당 포트가 있는지 확인하여 메시지를 출력합니다.
        FLAG=$(netstat -an | grep LISTEN | grep ":${PORT} " | wc -l)
        [ ${FLAG} -eq 1 ] && echo "[ OK ]" || echo "[ FAIL : ${MSG} ]"
    }

    netstat 결과에서 LISTEN 상태인 해당 포트가 있는지 확인하여 메시지를 출력합니다.

     

     

     

     

    7. 스크립트 실행부

    echo "***** Tomcat instance *****"
    # www 사용자의 tomcat java 프로세스 카운트 확인
    ChkProcCnt www tomcat java 1 1 "root) cd /root; /Startstart.sh"
    # 8080 포트의 tomcat이 LISTEN 상태인지 확인
    ChkListenPort "tomcat" 8080
    
    echo
    echo '***** Apache instance *****'
    # root 사용자의 apache httpd 프로세스 카운트 확인
    ChkProcCnt root apache httpd 1 1 "root) cd /root; ./Startstart.sh"
    # 80 포트의 apache가 LISTEN 상태인지 확인
    ChkListenPort "apache" 80

    Tomcat instance 와 Apache instance에 대해 각각 프로세스 카운트와 LISTEN 포트 여부를 확인하는 부분입니다.

     

     

     

     

    8. 결과

    스크립트 실행 결과

    Tomcat instance와 Apache instance가 실행 중 일때의 결과 값

     

    인스턴스가 정상적으로 실행 되어 있다면 [OK] 로 확인 되고, 정지 중 이라면 [FAIL]로 확인 됩니다.

     

     

     

    9. 전체 소스

    #!/bin/bash
    
    function PSEF_CODE {
        # 1.1.0
        if [ $# -eq 0 ]; then
            ps -ef | grep -iyv "ps -ef" | grep -v "grep -iy"
        else
            case $1 in
                PID)
                    shift
                    PSEF_CODE $* | awk '{print $2}'
                    ;;
                USER)
                    shift
                    USERNAME="$1"; shift
                    PSEF_CODE $* | awk -v USERNAME=$USERNAME 'tolower($1) == tolower(USERNAME)'
                    ;;
                PROC)
                    shift
                    STR="$1"; shift
                    PSEF_CODE $* | grep -iy "$STR"
                    ;;
                COUNT)
                    shift
                    PSEF_CODE $* | wc -l
                    ;;
            esac
        fi
    }
    
    function GREP_PROC {
        # version 1.3.0
        PID_OPT=""
        USER_OPT=""
        USER_NAME=""
        while [ $# -gt 0 ]; do
            case $1 in
                -c)
                    shift
                    CMD_LIST="COUNT ${CMD_LIST}"
                    ;;
                -P)
                    shift
                    CMD_LIST="PID ${CMD_LIST}"
                    ;;
                -u)
                    shift
                    USERNAME=$1; shift
                    CMD_LIST="${CMD_LIST} USER $(USERNAME)"
                    ;;
                *)
                    CMD_LIST="${CMD_LIST} PROC $1"
                    shift
                    ;;
            esac
        done
        CMD_LIST=$(echo $CMD_LIST | sed 's/PID COUNT/COUNT PID/g')
        PSEF_CODE ${CMD_LIST}
    }
    
    function ChkOK {
        # 1.0.0
        PARAM_MSG="$1"; shift
        RESULT=$1; shift
        RESULT_LIMIT_LOW=$1; shift
        RESULT_LIMIT_HIGH=$1; shift
        MSG="$@"
        printf "${PARAM_MSG} : "
        [ ${RESULT} -ge ${RESULT_LIMIT_LOW} -a ${RESULT} -le ${RESULT_LIMIT_HIGH} ] && echo "[ OK ]" || echo "[ FAIL : ${MSG} ]"
    }
    
    function ChkProcCnt {
        # 1.1.0
        OWNER="$1"; shift
        PROC="$1"; shift
        SUB_PROC="$1"; shift
        CNT_MIN=$1; shift
        CNT_MAX=$1; shift
        printf "${PROC}(${SUB_PROC}) : "
        PROC_CNT=$(PSEF_CODE COUNT USER ${OWNER} PROC "${PROC}" PROC "${SUB_PROC}")
        [ ${PROC_CNT} -ge ${CNT_MIN} -a ${PROC_CNT} -le ${CNT_MAX} ] && echo "[ OK ]" || echo "[ FAIL : Process count out of range ]"
    }
    
    function CntIP {
        # usage: CntIP IP
        IP=$1
        echo $(ifconfig -a | grep -iy " ${IP} " | grep -v "grep -iy" | wc -l)
    }
    
    function ChkListenPort {
        NAME=$1; shift
        PORT=$1; shift
        MSG=$*
        printf "Listening Port (${NAME}:${PORT}) : "
        FLAG=$(netstat -an | grep LISTEN | grep ":${PORT} " | wc -l)
        [ ${FLAG} -eq 1 ] && echo "[ OK ]" || echo "[ FAIL : ${MSG} ]"
    }
    
    echo "***** Tomcat instance *****"
    ChkProcCnt www tomcat java 1 1 "root) cd /root; /Startstart.sh"
    ChkListenPort "tomcat" 8080
    
    echo
    echo '***** Apache instance *****'
    ChkProcCnt root apache httpd 1 1 "root) cd /root; ./Startstart.sh"
    ChkListenPort "apache" 80

     

    전체 스크립트 소스입니다. 본인의 환경에 맞게 수정하여 사용하면 좋을 것 같습니다.

    반응형