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
현재 구성한 서버 환경에서는 잘 동작한다.
댓글 없음:
댓글 쓰기