function maxVersion {
FILE_FIND=$1
START_STR=$2
END_STR=$3
FILES=$(ls $FILE_FIND)
MAX_VERSION=-1
for FILE in $FILES ; do
FILE="$(basename -- $FILE)"
VERSION=`echo $FILE | grep -o -P "(?<=$START_STR).*(?=$END_STR)"`
if [ -n "$VERSION" ] ; then
IFS='.' read -ra arr <<< "$VERSION"
VERSION=${arr[2]}
if [ $VERSION -gt $MAX_VERSION ]; then
MAX_VERSION=$VERSION
fi
fi
done
echo $MAX_VERSION
}
CATALINA_HOME=/data/tomcat/apache-tomcat-9.0.7
PATCH_VERSION=$(maxVersion "/data/tomcat/apache-tomcat-*.zip" "tomcat-" ".zip")
echo "PATCH_VERSION: $PATCH_VERSION"
NOW_VERSION=`echo "$CATALINA_HOME" | grep -o -P '(?<=tomcat-).*(?=$)'`
IFS='.' read -ra arr <<< "$NOW_VERSION"
PATCHED_VERSION=${arr[2]}
echo "PATCHED_VERSION: $PATCHED_VERSION"
if [ $PATCH_VERSION -gt $PATCHED_VERSION ]; then
echo "패치 파일 있음. 현재: $NOW_VERSION, 패치 버전: $PATCH_VERSION"
fi
Tomcat
- [shell] Tomcat 버전 체크 2020.07.17
- Tomcat Multi Instance 설정 및 Shell 에서 컨트롤 2014.10.17
- 젠킨스(Jenkins) Maven tomcat7 redeploy reload, restart 2013.03.20
- SSL 사설 보안서버 2011.07.08
- Tomcat 5.5 설정 2007.03.07
[shell] Tomcat 버전 체크
Tomcat Multi Instance 설정 및 Shell 에서 컨트롤
Tomcat Multi Instance로 설정 하려면, 기동관련을 위해서 Shell도 만져야 하고, server.xml 도 만져야 한다.
그것을 Script에서만 하면 좋을것 같아서 고민 중, Tomcat에 적용해 보았다.
[env.sh]
#!/bin/sh DATE=`date +%Y%m%d_%H%M%S` export JAVA_HOME=/usr/local/java8 export PATH=$PATH:$JAVA_HOME/bin # Apache Balance Workers 값(WAS별 유니크) HTTPD_LB_WORKER_NM=testcluster HTTPD_WORKER_NM=$HTTPD_LB_WORKER_NM'11' PROJECT_NM_PREPIX= PROJECT_NM=test-cluster WAR_PATH=/usr/local/tomcat/webroot/$PROJECT_NM_PREPIX$PROJECT_NM WEB_ROOT=$WAR_PATH/webapp export HTTPD_WORKER_NM export PROJECT_NM export WAR_PATH export WEB_ROOT # 동일 머신에서 중복되지 않게(01~99: 최대 90개) export PORT_OFFSET=1 let SHUTDOWN_PORT=9100+$PORT_OFFSET let HTTP_PORT=9200+$PORT_OFFSET let HTTPS_PORT=9300+$PORT_OFFSET let AJP_PORT=9400+$PORT_OFFSET export SHUTDOWN_PORT export HTTP_PORT export HTTPS_PORT export AJP_PORT export CATALINA_HOME=/usr/local/tomcat/apache-tomcat export CATALINA_BASE=/usr/local/tomcat/domains/$HTTPD_LB_WORKER_NM # JVM Options : Server export JAVA_OPTS="-server $JAVA_OPTS" # JVM Options : Memory export JAVA_OPTS="$JAVA_OPTS -Xms2048m -Xmx2048m -Xss256k" # jdk7 이하 #export JAVA_OPTS="$JAVA_OPTS -XX:PermSize=256m -XX:MaxPermSize=256m" export JAVA_OPTS="$JAVA_OPTS -XX:+PrintGCTimeStamps " export JAVA_OPTS="$JAVA_OPTS -XX:+PrintGCDetails " export JAVA_OPTS="$JAVA_OPTS -Xloggc:$CATALINA_BASE/logs/gc_$DATE.log " export JAVA_OPTS="$JAVA_OPTS -XX:+UseParallelGC " export JAVA_OPTS="$JAVA_OPTS -XX:+UseParallelOldGC " export JAVA_OPTS="$JAVA_OPTS -XX:+ExplicitGCInvokesConcurrent " export JAVA_OPTS="$JAVA_OPTS -XX:+HeapDumpOnOutOfMemoryError " export JAVA_OPTS="$JAVA_OPTS -XX:HeapDumpPath=$CATALINA_BASE/logs/heapDump-$DATE.hprof " export JAVA_OPTS="$JAVA_OPTS -Djava.net.preferIPv4Stack=true" export JAVA_OPTS="$JAVA_OPTS -Dsun.rmi.dgc.client.gcInterval=0x7FFFFFFFFFFFFFFE" export JAVA_OPTS="$JAVA_OPTS -Dsun.rmi.dgc.server.gcInterval=0x7FFFFFFFFFFFFFFE" export JAVA_OPTS="$JAVA_OPTS -Djava.awt.headless=true" export JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=UTF-8" export JAVA_OPTS="$JAVA_OPTS -DjvmRoute=$HTTPD_WORKER_NM" export JAVA_OPTS="$JAVA_OPTS -Dtomcat.web.root=$WEB_ROOT" export JAVA_OPTS="$JAVA_OPTS -Dtomcat.port.shutdown=$SHUTDOWN_PORT" export JAVA_OPTS="$JAVA_OPTS -Dtomcat.port.http=$HTTP_PORT" export JAVA_OPTS="$JAVA_OPTS -Dtomcat.port.https=$HTTPS_PORT" export JAVA_OPTS="$JAVA_OPTS -Dtomcat.port.ajp=$AJP_PORT" # WEB JK_MOD 정보 export HTTPD_HOSTS=( "192.0.0.100" ) export LB_WORKER=$HTTPD_LB_WORKER_NM export WORKER=$HTTPD_WORKER_NM #HTTPD_HOSTS_STR="" for i in "${HTTPD_HOSTS[@]}" do HTTPD_HOSTS_STR="${HTTPD_HOSTS_STR}${i}," done echo "=============================================================" echo " Apache Tomcat 8.x ddakker@naver.com " echo "-------------------------------------------------------------" $CATALINA_HOME/bin/./version.sh echo "-------------------------------------------------------------" echo "PROJECT_NM=$PROJECT_NM" echo "WORKER_NM=$HTTPD_WORKER_NM" echo "WEB_ROOT=$WEB_ROOT" echo "SHUTDOWN_PORT=$SHUTDOWN_PORT" echo "HTTP_PORT=$HTTP_PORT" echo "HTTPS_PORT=$HTTPS_PORT" echo "AJP_PORT=$AJP_PORT" echo "HTTPD_HOSTS=$HTTPD_HOSTS_STR" echo "============================================================="
[start.sh]
#!/bin/sh . ./env.sh # 임시 파일 삭제 rm -Rf $CATALINA_BASE/temp/* # 로그 파일 관리 rm -Rf $CATALINA_BASE/logs/catalina.out if [ "`ps -eaf | grep java | grep "$CATALINA_BASE "`" != "" ]; then echo "Tomcat SERVER - $PROJECT_NM is already RUNNING..." exit; fi if [ ! -d "$WEB_ROOT" ]; then mkdir -p $WAR_PATH mkdir -p $WEB_ROOT mkdir -p $WAR_PATH/../logs/$HTTPD_LB_WORKER_NM fi cd $CATALINA_HOME/bin ./startup.sh if [ -z "`ps -eaf | grep java | grep "$CATALINA_BASE "`" ]; then echo "Error!!! Cannot start tomcat server." fi IS_WAIT=$1 IS_JK_CTL=$2 if [ "$IS_WAIT" == "wait" ]; then while [ `netstat -an | grep :$HTTP_PORT | grep LISTEN | wc | awk '{print $1}'` != 1 ]; do echo -ne "." sleep 1 done echo "Check WAS Context Ready http://localhost:$HTTP_PORT ..." until [ "`curl --silent -o --show-error --connect-timeout 1 -w "%{http_code}\n" http://localhost:$HTTP_PORT | egrep '200|301|302|500'`" != "" ]; do echo -ne "." sleep 1 done fi if [ "$IS_JK_CTL" == "update" ]; then for HTTPD_HOST in "${HTTPD_HOSTS[@]}" do echo "<<< Turn-ON Worker $WORKER in $LB_WORKER [$HTTPD_HOST]" if [ "`curl --silent --show-error --connect-timeout 1 -I \"http://$HTTPD_HOST/jkstatus/?cmd=update&w=$LB_WORKER&sw=$WORKER&vwa=0\" | egrep '404|500|503'`" != "" ] then echo "<<< Error" else echo "<<< Done" fi done fi
[shutdown.sh]
#!/bin/sh . ./env.sh IS_WAIT=$1 IS_JK_CTL=$2 JK_CTL_AFTER_DELAY=$3 PID=`ps -ef | grep java | grep "$CATALINA_BASE " | awk '{print $2}'` if [ e$PID == "e" ] then echo "NOT RUNNING!!!" exit; fi if [ "$JK_CTL_AFTER_DELAY" == "" ]; then JK_CTL_AFTER_DELAY=0 fi if [ "$IS_JK_CTL" == "update" ]; then for HTTPD_HOST in "${HTTPD_HOSTS[@]}" do echo "<<< Turn-OFF Worker $WORKER in $LB_WORKER [$HTTPD_HOST]" #if [ "`curl --silent --show-error --connect-timeout 1 -I \"http://$HTTPD_HOST/jkstatus/?cmd=update&w=$LB_WORKER&sw=$WORKER&vwa=1\" | egrep '403|404|500|503'`" != "" ] if [ "`curl --silent --show-error --connect-timeout 1 -I \"http://$HTTPD_HOST/jkstatus/?cmd=update&w=$LB_WORKER&sw=$WORKER&vwa=2\" | egrep '403|404|500|503'`" != "" ] then echo "<<< Error" else echo "<<< Done" fi done echo "+sleep $JK_CTL_AFTER_DELAY" sleep $JK_CTL_AFTER_DELAY fi $CATALINA_HOME/bin/./shutdown.sh if [ "$IS_WAIT" == "wait" ]; then I=0 until [ "`ps -eaf | grep java | grep "$CATALINA_BASE "`" == "" ]; do if [ $I == 120 ]; then ps -ef | grep java | grep "$CATALINA_BASE " | awk {'print "kill -9 " $2'} | bash -x break; fi let I=$I+1 echo -ne "." sleep 1 done fi echo "*** Tomcat process ($PID) received SHUTDOWN signal ***" >> $CATALINA_BASE/logs/catalina.out
[setting.sh]
#!/bin/sh . ./env.sh if [ ! -d "$WEB_ROOT" ]; then mkdir -p $WAR_PATH mkdir -p $WEB_ROOT mkdir -p $WAR_PATH/../logs/$HTTPD_LB_WORKER_NM fi cd $CATALINA_BASE find ./ -type d -exec chmod 750 {} \; find ./ -type f -exec chmod 740 {} \; chmod -Rf 640 $CATALINA_BASE/logs/* cd $WEB_ROOT find ./ -type d -exec chmod 755 {} \; find ./ -type f -exec chmod 640 {} \; if [ ! -e "$WEB_ROOT/index.html" ]; then echo "Hello World" >> $WEB_ROOT/index.html fi if [ ! -e "$WEB_ROOT/info.jsp" ]; then echo "<%@ page language=\"java\" contentType=\"text/html; charset=EUC-KR\" pageEncoding=\"EUC-KR\"%><%@page import=\"java.net.InetAddress\"%><%String serverIP = \"\";try{serverIP = InetAddress.getLocalHost().getHostAddress();serverIP = serverIP.substring(serverIP.lastIndexOf(\".\")+1);}catch(Exception e){}String info = request.getServerName() + \", \" + serverIP + \", \" + System.getProperty(\"jvmRoute\");out.print(info);// test%>" >> $WEB_ROOT/info.jsp fi if [ $LANG = "ko_KR.eucKR" ]; then cd $CATALINA_BASE FILE_ENC=`file -i env.sh ` UTF8_IDX=`awk -v a="$FILE_ENC" -v b="utf-8" 'BEGIN{print index(a,b)}' ` if [ $UTF8_IDX -gt 0 ]; then cd $CATALINA_BASE echo "----- encoding convertor -----" find . -name '*.sh' -exec iconv -f utf-8 -t euc-kr {} -o {} \; fi
[top.sh]
#!/bin/sh . ./env.sh PID=`ps -ef | grep java | grep "$CATALINA_BASE " | awk '{print $2}'` if [ e$PID == "e" ] then echo "NOT RUNNING!!!" exit; fi $CATALINA_BASE/../monitor_agent/./jvmtop.sh $PID
[dump.sh]
#!/bin/sh . ./env.sh for count in 1 2 3 4 5; do echo "Thread Dump : $count" for i in `ps -ef | grep java | grep "base=$CATALINA_BASE " | awk '{print $2}'`;do date #echo "+kill -3 $i" echo "+jstack -l $i >> $CATALINA_BASE/logs/thread_dump.$i" #kill -3 $i jstack -l $i >> $CATALINA_BASE/logs/thread_dump.$i #echo "sleep 1 sec" #sleep 1 done echo "done" sleep 3 done
[dump_cpu.sh]
#!/bin/sh . ./env.sh for count in 1 2 3 4 5; do echo "Thread Dump : $count" for i in `ps -ef | grep java | grep "base=$CATALINA_BASE " | awk '{print $2}'`;do top -H -b -n1 >> $CATALINA_BASE/logs/dump_high_cpu_$i.txt date #kill -3 $i echo "+jstack -l $i >> $CATALINA_BASE/logs/dump_high_cpu_$i.txt" jstack -l $i >> $CATALINA_BASE/logs/dump_high_cpu_$i.txt echo "cpu snapshot and thread dump done. #" done echo "done" sleep 3 done
[httpd.sh]
#!/bin/sh . ./env.sh if [ "$1" == "stop" ]; then for HTTPD_HOST in "${HTTPD_HOSTS[@]}" do echo "<<< Turn-OFF Worker $WORKER in $LB_WORKER [$HTTPD_HOST]" if [ "`curl --silent --show-error --connect-timeout 1 -I \"http://$HTTPD_HOST/jkstatus/?cmd=update&w=$LB_WORKER&sw=$WORKER&vwa=2\" | egrep '403|404|500|503'`" != "" ] then echo "<<< Error" else echo "<<< Done" fi done fi if [ "$1" == "start" ]; then for HTTPD_HOST in "${HTTPD_HOSTS[@]}" do echo "<<< Turn-ON Worker $WORKER in $LB_WORKER [$HTTPD_HOST]" if [ "`curl --silent --show-error --connect-timeout 1 -I \"http://$HTTPD_HOST/jkstatus/?cmd=update&w=$LB_WORKER&sw=$WORKER&vwa=0\" | egrep '404|500|503'`" != "" ] then echo "<<< Error" else echo "<<< Done" fi done fi
[server.xml]
젠킨스(Jenkins) Maven tomcat7 redeploy reload, restart
Tomcat 7.x + Jenkins ver. 1.500
[Maven tomcat plugin을 이용하여 deploy -> reload 방법]
tomcat/conf/tomcat-users.xml
pom.xml
org.codehaus.mojo tomcat-maven-plugin 1.1 UTF-8 war http://localhost/manager/text admin admin
젠킨스 프로젝트 설정 Build 부분 명령어에 tomcat:redeploy tomcat:reload
[Shell 실행하여 Tomcat 재시작 방법]
jenkins에서 빌드 스크립트 종료 후 아래 shell 실행하면 정상 start 후 Process를 종료해버려서 기껏 올라간 Tomcat이 종료되는 문제가 발생한다.
그럴 경우 해당 프로젝트 설정에서 "This build is parameterized" 체크 하고, "Add Parameter" 에서 BUILD_ID 에다가 아무 값이나 셋팅!!
#!/bin/bash
echo "Shutdown tomcat now...." bash /usr/local/tomcat/bin/shutdown.sh echo "tomcat is now terminated..." sleep 10 if [ -z "`ps -eaf | grep java | grep /usr/local/tomcat/bin`" ]; then echo "Tomcat was terminated successfully." else ps -eaf | grep java | grep /usr/local/tomcat/bin | awk '{print $2}' | while read PID do echo "Killing $PID... " kill -9 $PID echo "Tomcat is being shutdowned" done fi echo "tomcat restart now" /usr/local/tomcat/bin/./startup.sh AA=`ps -eaf | grep java | grep /usr/local/tomcat/bin` echo "AA: $AA" if [ -z "`ps -eaf | grep java | grep /usr/local/tomcat/bin`" ]; then echo "Error!!! Cannot start tomcat server." else echo "Tomcat restart succcessfully. " fi echo "Job finished"
[참조 shell] http://ausgang.egloos.com/2947190
startup.sh
#!/bin/sh . ./env.sh export CATALINA_HOME=/usr/local/tomcat/apache-tomcat-8.0.9 export CATALINA_BASE=/usr/local/tomcat/domains/$PROJECT_NM export JAVA_OPTS="-Djava.awt.headless=true -server -Xms512m -Xmx1024m -XX:NewSize=256m -XX:MaxNewSize=256m -XX:PermSize=256m -XX:MaxPermSize=512m -XX:+DisableExplicitGC" export CATALINA_OPTS=$CATALINA_OPTS" -Dfile.encoding=UTF-8" cd $CATALINA_HOME/bin ./startup.sh AA=`ps -eaf | grep java | grep $WAS_PATH` echo "AA: $AA" if [ -z "`ps -eaf | grep java | grep $WAS_PATH`" ]; then echo "Error!!! Cannot start tomcat server." fi while [ `netstat -an | grep :$WAS_PORT | grep LISTEN | wc | awk '{print $1}'` != 1 ]; do echo -ne "." sleep 1 done echo "Check WAS Context Ready http://localhost:$WAS_PORT ..." until [ "`curl --silent --show-error --connect-timeout 1 -I http://localhost:$WAS_PORT | grep 'Coyote'`" != "" ]; do echo -ne "." sleep 1 done echo "Start WAS And Context $PROJECT_NM Tomcat Succcess"
shutdown.sh
#!/bin/sh . ./env.sh export CATALINA_HOME=/usr/local/tomcat/apache-tomcat-8.0.9 export CATALINA_BASE=/usr/local/tomcat/domains/$PROJECT_NM $CATALINA_HOME/bin/./shutdown.sh I=0 until [ "`ps -eaf | grep java | grep $WAS_PATH`" == "" ]; do if [ $I == 5 ]; then ps -ef | grep java | grep "$WAS_PATH " | awk {'print "kill -9 " $2'} | sh -x break; fi let I=$I+1 echo Stop WAS Finish? Sleeping for 2 seconds sleep 2 done
SSL 사설 보안서버
Tomcat 5.5 설정
<Host appBase="D:\WebRoot\study" autoDeploy="true" name="localhost" unpackWARs="true" xmlNamespaceAware="false" xmlValidation="false">
[ 자동 리로드 ]
C:\tomcat-5.5.17\conf\Catalina\localhost\ROOT.xml
<Context path="" docBase="D:\WebRoot\study\ROOT" debug="0" reloadable="true" crossContext="true"/>
컨텍스트 이름별로 xml파일을 만든다.
[ 환경설정 ]
JAVA_HOME
CATALINA_HOME
CLASSPATH