WEB서버, WAS서버가 죽었을 경우 놀다가다 급히 들어와서 이놈을 살려줘야하는데 이런 귀찮음을 없애고자 3분마다 서버상태를 체크해서 서버오류시 지가 알아서 재시작하는 방법이다.
테스트 환경은 다음과 같다.
OS : 레드햇 리눅스
WAS서버 : 톰캣 6.0
1. 웹root에 아래 내용만 넣은 checkLive.jsp 파일을 생성한다.
success
http://111.111.111:8080/checkLive.jsp 실행해서 success 란 메시지가 정상적으로 뿌려지는지 확인한다.
2. autoRestartServer.sh 파일 생성
적당한 위치(여기선 /home1/irteam/script/)에 생성해서 다음 내용 넣는다.
#!/bin/sh
##### step 1
export JAVA_HOME=/home1/irteam/jdk/jdk1.6.0_13
export PATH="$PATH:$JAVA_HOME/bin"
export CATALINA_HOME=/home1/irteam/tomcat/
export PATH="$PATH:$CATALINA_HOME/bin"
export checkFile=/home1/irteam/script/checkLive.jsp
export nowDate=`date +%Y-%m-%d%t%H:%M`
##### step 2
cd /home1/irteam/script
wget http://111.111.111.111:8080/checkLive.jsp
##### step 3
if [ -r "$checkFile" ] ; then
echo "$nowDate 정상!"
export file_content="`cat $checkFile`"
rm -rf $checkFile
if [ $file_content != "success" ] ; then
/home1/irteam/tomcat/bin/shutdown.sh
sleep 10
/home1/irteam/tomcat/bin/startup.sh
fi
else
echo "$nowDate 실패!"
/home1/irteam/tomcat/bin/shutdown.sh
sleep 10
/home1/irteam/tomcat/bin/startup.sh
echo "$nowDate 서버 재시작 완료!"
fi
chmod 744 autoRestartServer.sh 해서 실행권한 준다.
그리고 나서 이 shell 파일 실행시켜서 정상작동하는지 확인한다.
step 1
그냥 /home1/irteam/script/autoRestartServer.sh 실행시킬 경우에는 실행이 되지만 이 걸 crontab에 등록할 경우에는 자바홈, 톰캣홈을 못찾는 경우가 생긴다. 그래서 shell 실행시 필요한 환경변수인 JAVA_HOME, CATALINA_HOME 등을 직접 선언해준다.
step 2
리눅스의 wget 명령어를 이용해서 http://111.111.111.111:8080/checkLive.jsp 파일의 내용을 가져온다. 접속 이 정상적이라면 checkLive.jsp 파일을 다운받는다. 접속이 정상적이지 않다면 오류가 발생하면서 이 파일을 다운받지 못한다.
step 3
checkLive.jsp 파일이 존재하는지 확인후 그 파일 내용이 success라 적혀있으면 정상적으로 서버가 동작중것이고 그렇지 않다면 서버오류로 인식해서 톰캣서버를 재시작한다.
3. crontab에 등록
## tomcat server auto restart
*/3 * * * * /home1/irteam/script/autoRestartServer.sh >> /home1/irteam/script/autoRestartServer.log
3분마다 체크하도록 crontab에 등록한다. 체크한 로그는 autoRestartServer.log에 기록되도록 해서 나중에 서버의 동작 상태를 확인 할 수 있도록 한다.
원래 초기버젼은 3분마다 무조건 서버를 재시작하는하는 방식이였다. 이 방식의 경우 서버 실행중에 또 서버를 실행하는 것으로 나중에 실행된 것은 내부적으로 오류를 발생하면서 종료된다. 실제, 이런 방식을 이용해도 실제 서비스에는 문제가 없으나 간혹가다가 리눅스상에서 불필요한 PID들이 생기는 경우가 있고 주기적으로 오류메시지가 발생한다는것이 좀 찝찝한 구석이 있다.
두번째로 시도한 방식이 톰캣PID 존재여부로 서버중지여부를 판단해서 서버재시작shell을 만들었는데 이 방식은 톰캣서버가 비정상적으로 종료될경우 찌꺼기 같은 톰캣PID들이 남아있어서 서버중지여부를 판단할수 없는 경우가 있었다.
그래서 이것저것 시도해본 결과 좀 번거롭더라도 주기적으로 웹서버에 연결해서 서버상태를 체크하는 방식을 사용하게 된것이다.