개인적으로 사용 중이었던 방법인데 11번가도 동일하게 사용 중(참고 링크)

 

run_job.sh

#!/bin/bash

#apply env and etc
source ~/.bashrc


#사용 예
# ./run_job.sh 블라블라.jar 128M DB_HEALTH_CHECK argument_test=92

#실행할 Jar 심볼릭 링크 경로
JAR_LINK_PATH=$1

#Java 힙 메모리
JAVA_HEAP_MEMORY=$2

#Job name
JOB_NAME=$3

# 인자 갯수가 적은 경우 경고 메시지 출력
if [ $# -lt 3 ]; then
  echo "Usage: $0 JAR_LINK_PATH JAVA_HEAP_MEMORY JOB_NAME jobParameters[...]"
  exit 1
fi


#앞 3개 인자는 건너뜀
shift 3

jobParameters=""
for arg in "$@";
do
  if [ -n "$jobParameters" ]; then
    jobParameters+=" "
  fi
  jobParameters+="$arg"
done

JAVA_OPTS=" ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom"
JAVA_OPTS=" ${JAVA_OPTS} -server -Xms${JAVA_HEAP_MEMORY} -Xmx${JAVA_HEAP_MEMORY} -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${HOME}/oom_error_batch.hprof"

# 심볼릭 링크가 연결되어 있는 jar 파일 경로 가져오기
ORIGIN_JAR=$(readlink ${JAR_LINK_PATH})

echo "> ORIGIN_JAR_PATH: ${ORIGIN_JAR}"

$JAVA_HOME/bin/java -jar $JAVA_OPTS ${ORIGIN_JAR} --job.name=$JOB_NAME $jobParameters



switch-link.sh

#!/bin/bash

#사용 예
# ./switch-link.sh 블라블라/latest/블라블라_BATCH.jar

#실행할 Jar파일 전체 경로
DEPLOYED_JAR_FILE_FULL_PATH=$1

#실행할 Jar 파일 이름
JAR_FILE_NAME=$(basename "$DEPLOYED_JAR_FILE_FULL_PATH")

#APP 디렉토리 home
DEPLOYED_JAR_DIR=$(dirname "$DEPLOYED_JAR_FILE_FULL_PATH")
APP_HOME_PATH=$(dirname "$DEPLOYED_JAR_DIR")

#실행되는 app 심볼릭 링크가 위치할 디렉토리 경로
RUN_APP_LINK_DIR_PATH=${APP_HOME_PATH}

#run command로 전달된 argument 개수
ARG_CNT=$#

#run argument로 1개만 전달받아야함
REQUIRED_ARG_CNT=1

#기존에 배포된 디렉토리 유지할 개수(latest 디렉토리 제외한 deployed로 시작하는 디렉토리)
MAINTAIN_DEPLOYED_DIRECTORY_COUNT=10

function echo_host
{
        host=`hostname`
        echo "[$host] $1"
}

function check_arg
{

    if [ "$ARG_CNT" != "$REQUIRED_ARG_CNT" ] ; then
        echo_host "## Requested argument error. Required argument count is $REQUIRED_ARG_CNT. But requested $ARG_CNT"
        exit -1;
    fi

    # 배포된 파일이 존재하는지 확인
    if [ ! -f "$DEPLOYED_JAR_FILE_FULL_PATH" ]; then
        echo_host "Error: DEPLOYED_JAR_FILE_FULL_PATH does not exist."
        exit -1
    fi

}

#디렉토리 준비
function prepare_directory
{

    #실제 마지막 배포되어 실행될 jar파일의 심볼링 링크 디렉토리가 없다면 생성
    if [[ ! -e $RUN_APP_LINK_DIR_PATH ]]; then
        mkdir -p $RUN_APP_LINK_DIR_PATH
        echo_host ">>>> ${RUN_APP_LINK_DIR_PATH} (RUN_APP_LINK_DIR_PATH) Directory has been created."
    fi

}

# 마지막 배포된 jar파일을 해당 배포버전의 전용 디렉토리로 복사
function copy_deployed_jar_to_owned_dir {

    #마지막 배포된 Jar파일을 복사할 디렉토리 이름.
    # 참고: 오래된 디렉토리 삭제할 때 prefix deployed로 시작하는 디렉토리를 대상으로 하기 때문에 deployed라는 접두어는 유지해야함
    COPY_DIRECTORY_NAME=deployed-$(/bin/date +%Y-%m-%d_%H%M%S)

    # 배포되는 jar파일을 복사할 새로운 디렉토리 생성
    echo_host ">>>> mkdir deployed jar copy directory. [${APP_HOME_PATH}/${COPY_DIRECTORY_NAME}]"
    mkdir -p ${APP_HOME_PATH}/${COPY_DIRECTORY_NAME}


    # Deploy Path에 배포된 jar 파일을 새로운 디렉토리로 복사하기.
    echo_host ">>>> copy [${DEPLOYED_JAR_FILE_FULL_PATH}] to [${APP_HOME_PATH}/${COPY_DIRECTORY_NAME}/${JAR_FILE_NAME}]"
    cp -f ${DEPLOYED_JAR_FILE_FULL_PATH} ${APP_HOME_PATH}/${COPY_DIRECTORY_NAME}/${JAR_FILE_NAME}

}

#심볼릭 링크 생성(신규로 실행되는 배치 Job은 해당 심볼릭 링크를 바라봄으로 새로 배포된 jar로 실행되게 됨)
function create_run_jar_link {

    BEFORE_JAR_PATH=$(readlink ${RUN_APP_LINK_DIR_PATH}/${JAR_FILE_NAME})

    # 새로운 디렉토리 경로에 복사된 jar 파일로 링크 변경하기.
    # ln -Tfs TARGET LINK 명령으로 링크를 변경
    # -T option: –no-target-directory treat LINK_NAME as a normal file. 링크 파일을 일반 파일처럼 다루는 옵션
    # -f option: –force remove existing destination files. 심볼릭 링크가 이미 존재할 경우 덮어쓰는 옵션
    # -s option: –symbolic make symbolic links instead of hard links. 심볼릭 링크를 생성하는 옵션
    echo_host ">>>> Link switched from [$BEFORE_JAR_PATH] to [$APP_HOME_PATH/$COPY_DIRECTORY_NAME/$JAR_FILE_NAME]"
    ln -Tfs ${APP_HOME_PATH}/${COPY_DIRECTORY_NAME}/${JAR_FILE_NAME} ${RUN_APP_LINK_DIR_PATH}/${JAR_FILE_NAME}

}

function remove-old-directories() {

    # 1) 배포된 디렉토리 개수
    DIRECTORY_COUNT=$(ls -d ${APP_HOME_PATH}/deployed*/ | wc -l)

    # 유지할 디렉토리보다 많이 존재할 경우
    if [ $DIRECTORY_COUNT -gt $MAINTAIN_DEPLOYED_DIRECTORY_COUNT ]
    then

      # 2) 제거할 디렉토리 개수 카운트
      REMOVE_TARGET_COUNT=$(( ${DIRECTORY_COUNT} - ${MAINTAIN_DEPLOYED_DIRECTORY_COUNT}))

      # 3) 오래된 디렉토리부터 제거할 디렉토리 개수만큼 추출
      # 오래된 순으로 제거하기 위해 ls 명령어의 -t, -r 옵션 사용.
      # -t option: 파일과 디렉토리를 최근 시간 기준 내림차순 정렬
      # -r option: 정렬된 데이터의 순서를 오름차순으로
      REMOVE_TARGET_LIST=$(ls -dltr ${APP_HOME_PATH}/deployed*/ | head -$REMOVE_TARGET_COUNT | awk '{print $9}')

      # 삭제 대상 디렉토리 제거
      for file in ${REMOVE_TARGET_LIST}
      do
        echo ">>>> remove $file"
        /usr/bin/rm -rf ${file}
      done
    fi
}

# argument valid 체크
check_arg

#디렉토리 준비
prepare_directory

#jar 파일을 유지하기 위한 해당 jar용 디렉토리로 복사
copy_deployed_jar_to_owned_dir

#심볼릭 링크 생성
create_run_jar_link

#오래된 디렉토리 제거를 통해서 디스크 용량 관리
remove-old-directories

+ Recent posts