본문 바로가기

Spring & Java

Springboot jar execute script

반응형

스프링으로 개발한 후 메이븐 컴파일 하여 war 파일을 톰켓에 넣어 실행 할 경우에는 톰캣 서비스를 통해서 시작/중지 가능하다.

물론 톰캣이 서비스에 등록되어있다고 가정 했을경우임.

서버에서 톰캣을 서비스에 등록하여 systemctl tomcat start/stop 을 사용하여 시작 중지가 가능하다. 

하지만 스프링 부트로 개발 한후 임베디드 톰캣을 그대로 사용한 경우이면 별도의 메이븐 설정을 하거나 시스템 서비스에 등록 해주어야 서비스 관리가 가능 하다.


스프링 부트로 개발한 jar 파일을 독립적으로 시작 중지 를 하려면 nohub java -jar xxx.jar 로 실행 하여야 한다.

하지만 중지할경우에는 해당 프로세스 아이디를 ps 로 찾은 후 해당 프로세스 아이디를 kill 로 중지 시켜줘야 한다.

이러한 과정을 쉘 스크립트로 관리 할 수있도록 작성 하였다.




#!/bin/bash
# chkconfig 2345 20 80
# written by Gavin Kim on 2018.05.18
# 프로세스 명을 명시한다.
readonly PROC_NAME="springboot"
# jar 파일
readonly DAEMON="/springboot-0.0.1-SNAPSHOT.jar"
# 프로세스 아이디가 존재할 패스를 설정
readonly PID_PATH="/springboot"
readonly PROC_PID="${PID_PATH}${PROC_NAME}.pid"

# 시작 함수

start()
{
   echo "Starting ${PROC_NAME}..."
    local PID=$(get_status)
    if [ -n "${PID}" ]; then
        echo "${PROC_NAME} is already running"
        exit 0
    fi
    nohup java -jar -XX:MaxPermSize=128m -Xms512m -Xmx1024m "${DAEMON}" > /dev/null 2>&1 &
    local PID=${!}

    if [ -n ${PID} ]; then
        echo " - Starting..."
        echo " - Created Process ID in ${PROC_PID}"
        echo ${PID} > ${PROC_PID}
    else
        echo " - failed to start."
    fi
}
# 중지
stop()
{
    echo "Stopping ${PROC_NAME}..."
    local DAEMON_PID=`cat "${PROC_PID}"`

    if [ "$DAEMON_PID" -lt 3 ]; then
        echo "${PROC_NAME} was not running."
    else
        kill $DAEMON_PID
        rm -f $PROC_PID
        echo " - Shutdown ...."
    fi
}
# 상태
status()
{
    local PID=$(get_status)
    if [ -n "${PID}" ]; then
        echo "${PROC_NAME} is running"
    else
        echo "${PROC_NAME} is stopped"
        # start daemon
        #nohup java -jar "${DAEMON}" > /dev/null 2>&1 &
    fi
}

get_status()
{
    ps ux | grep ${PROC_NAME} | grep -v grep | awk '{print $2}'
}

# 케이스 별로 함수를 호출하도록 한다.

case "$1" in
start)
start
sleep 7
;;
stop)
stop
sleep 5
;;
status)
status "${PROC_NAME}"
    ;;
    *)
    echo "Usage: $0 {start | stop | status }"
esac
exit 0




해당 스크립트만으로도 사용 가능 하지만 해당스크립트를 서비스에 등록한 후 사용하는것이 효율적일 수도 있다.

서비스 등록방법은 서버 OS 마다 차이가 있을수 있으니 생략 하도록 한다.

서비스에 등록하고, 시작시 자동 시작할 수있도록 하였으면 아래와 같이 실행 하면 된다.

$service springboot start | stop | status


PS: 실행 되지 않은 상태에서 중지 할 경우 kill 할 경우 integer sig 와 같은 오류 메시지를 볼수있는데 해당 메시지는 감안해서 사용하도록 한다. 


반응형