운영체제

톰캣 자동 배포를 위한 shell script

소프 2022. 1. 22.

배경

/home/tomcat1
/home/tomcat2
/home/tomcat3

하나의 서버에 여러 톰캣을 구축하여 가동중에 있습니다. 톰캣 배포는 보통 아래의 과정을 거칩니다.

webapps폴더안의 기존 ROOT.war 백업 -> 톰캣 shutdonw -> 기존 ROOT.war, ROOT폴더 제거 -> 새로운 war파일 webapps로 이동 -> 톰캣 실행

이러한 과정을 명령어로 일일이 치는것도 귀찬흥ㄴ데 배포해야할 프로젝트가 여러개 있으면 매우 귀찮습니다.

그래서 이러한 과정을 한번에 실행할 수 있는 쉘스크립트를 만들어 봤습니다.

 

사전 조건

  • 프로젝트 폴더명이랑 war파일 이름이 같아야 합니다.
    • 톰캣 경로 :  /home/tomcat1/... 
    • 배포할 war 파일 이륾 : tomcat1.war 

gradle를 쓴다면 아래 설정을 추가하면 됩니다.

//plain war제거
war {
	enabled = false
}

bootWar {
	archivesBaseName = '{폴더명}'
	archiveFileName = '{폴더명}.war'
}

 

쉘스크립트

deploy.sh

명령어 종류

start :  톰캣을 실행시킵니다.

copy : 기존 프로젝트의 ROOT.war을 복사합니다.

stop : 톰캣을 종료합니다.

status : 톰캣 가동상태를 확인합니다.

 

사용법

./deploy.sh {war파일 혹은 프로젝트 폴더 이름} {명령어}

ex) ./deploy.sh tomcat1.war {stop | copy | stop | status}

 

#!/bin/bash
readonly NAME=$1
readonly ACTION=$2

readonly DATE_BIN=$(command -v date)
readonly GREP_BIN=$(command  -v grep)
readonly PS_BIN=$(command -v ps)

readonly PATH="/home/${NAME}/"
readonly NOW_TIME="$(${DATE_BIN} "+%Y%m%d")_$(${DATE_BIN} "+%H%M%S")"

# 톰캣을 실행한다.
start()
{
  value=$(isAlive)
  if [ -f /home/{계정명}/${NAME}.war ]; then
      if [ "${value}" -eq 1 ]; then
          echo "${NAME} is alive"
      else
          /bin/rm -rf ${PATH}/webapps/ROOT
          /bin/rm ${PATH}/webapps/ROOT.war
          /bin/cp "/home/{계정명}/${NAME}.war" "${PATH}/webapps/ROOT.war"
          /bin/sudo /bin/sh /home/${NAME}/bin/startup.sh
          echo "Start is succeed. Please Catalina.out check"
      fi	

  else
      echo "Please upload ${NAME}.war at /home/{계정명}"
  fi
    
}

# ROOT.war를 복사한다.
copy()
{
   /bin/cp "${PATH}webapps/ROOT.war" "${PATH}webapps/ROOT.wa.${NOW_TIME}"
   echo "Copy is succeed."
}


# 톰캣을 중지시킨다.
stop()
{
  value=$(isAlive)
  if [ "${value}" -eq 0 ]; then
      echo "${NAME} has stoppped."
      exit 0
  else
      /bin/sudo /bin/sh /home/${NAME}/bin/shutdown.sh
     echo "Stop is succeed. Please Catalina.out check"
  fi
}

# 톰캣이 가동중인지 확인한다.
status()
{
   value=$(isAlive)
   if [ "${value}" -eq 0 ]; then
      echo "${NAME} is stopped" 
   else
      echo "${NAME} is running"
   fi
}


# 톰캣 프로세스가 살아있으면 1을 반환하고 죽어있으면 0을 반환한다.
isAlive()
{
  if [ -z "`${PS_BIN} -eaf | ${GREP_BIN} java | ${GREP_BIN} ${PATH}`" ]; then
      echo 0
  else
      echo 1
  fi
}

# 케이스 별로 함수를 호출하도록 한다.
case "$2" in
start)
start NAME ACTION
;;
copy)
copy NAME ACTION
;;
stop)
stop NAME ACTION
;;
status)
status NAME ACTION
;;
 *)
    echo "Usage: $1 {start | stop | copy | status}"
esac
exit 0

 

 

start 흐름

1. war 파일이 특정 경로에 있는지 확인합니다.

2. 톰캣이 종료 되었는지 확인합니다.

3. 기존 프로젝트 경로의 ROOT폴더랑 ROOT.war를 제거합니다.

4. 배포할 war 파일을 ROOT.war 이름으로 지정한 프로젝트 배포 경로로 복사합니다.

5. 톰캣을 실행합니다.

 

stop 흐름

1. 톰캣이 가동중이면 종료합니다.

 

copy 흐름

1. 지정 프로젝트 경로의 ROOT.war를 아래 양식으로 복사합니다.

 

status 흐름

톰캣의 가동 상태를 확인합니다.

 

log.sh

#!/bin/bash
export LANG=ko_KR.UTF-8

# run tail -f in background
tail -f /home/$1/logs/catalina.out

# process id of tail command
tailpid=$!

# now kill the tail process
kill $tailpid

톰캣 시작 후 찍히는 로그를 확인할때 쓰는 쉘스크립트 입니다.

 

사용법

./log.sh {프로젝트 폴더명}

 

 

'운영체제' 카테고리의 다른 글

DeadLock  (0) 2022.03.18

댓글