2019년 7월 10일 수요일

Tomcat 기동 시 CLOSE_WAIT으로 인해 startup 이 안되는 경우

jvm 경우 프로세스를 강제종료(kill) 하면 모든 스레드도 종료된다.

하지만 특이한 경우 프로세스를 강제종료(kill) 했음에도 불구하고, 종료되지 않은 경우가 있는데 이를 확인하기 위해 netstat 으로 톰켓 포트를 확인 해 봤을 시에 해당 포트가 CLOSE_WAIT이 걸리면서 기동을 하려고 했을 때 아래와 같은 메시지가 발생할 수 있다.

SEVERE [main] org.apache.catalina.core.StandardServer.await StandardServer.await: create[localhost:8005]:
        java.net.BindException: Address already in use (Bind failed)


이런 경우에 정말 깔끔하게 톰캣 프로세스를 종료 하는 스크립트를 만들어 봤다.
 

#!/bin/bash

export CATALINA_BASE=$(dirname $(dirname $(realpath $0)))
. $CATALINA_BASE/bin/env.sh > /dev/null


# 프로세스 id 찾은 후 변수 처리
PID=`ps -ef | grep java | grep "=$SERVER_NAME" | awk '{print $2}'`

# 현재 서비스 중이 포트를 찾아서 변수 처리 (명령어 종류는 많음)
HTTP_PORT=$CATALINA_BASE/bin/env.sh  | grep HTTP_PORT


# waitng 이 걸린 connection을 찾은 후 변수 처리 cconnection 수가 많기 때문에 반복문 사용 
for NETSTAT in `netstat -anp 2>/dev/null | grep $HTTP_PORT | awk '{print $4}'`;
do
    echo "$NETSTAT"
done


if [ $NETSTAT != 0 ]; then

# fuser 명령어를 통해서 모든 커넥션 정리
  fuser -kvn tcp ${HTTP_PORT};


# 명령어가 없을 수도 있으니 명령어가 실행 되었는지 확인 0=true not 0=false
  if [ $? != 0 ]; then
    echo "[ERROR] Have to install psmisc (ex) yum install psmisc -y"
    exit;
  fi
  sleep 2;
  else
    echo "### Tomcat is Not Runnable ## "
    echo ""
    exit;
fi

현재 구성한 서버 환경에서는 잘 동작한다.












댓글 없음:

댓글 쓰기