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 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]



  
  
  
  
  
  
  
  
    
    
    
    
 
      
        
      
      
                
        

      
    
  


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

<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

+ Recent posts