반응형

기본 변수 설정 및 사용자로부터 데이터 입력 받은 후 가공

 

작업 개요

스프링부트 프로젝트를 war빌드한 파일을 서버에 올려 실행하기 까지의 작업이 번거로워 만들게 되었다

* 아직은 jenkins 나 gitlab을 구성할 수 없는 상황임

 

목표

리눅스 커멘드로 사용자로부터 파일명을 입력받아 실행하면 파일이 원하는 경로에 백업 및 복사되고 자동 재시작한다

(원하는 경우 재시작이 잘 되고있는 지 tail -f 로그도 출력한다)

 

실행 예제

절대경로, 상대경로가 가능하며 끝에 tail을 붙일경우 로그출력

(알리아스(~/.bashrc) 등록 정보 : alias patch='alias | /home/patch.sh')

1. patch myproject-0.0.1-SNAPSHOT-plain.war tail

2. patch myproject-0.0.1-SNAPSHOT-plain.war

3. patch /home/users/zzint/myproject-0.0.1-SNAPSHOT-plain.war tail

4. patch /home/users/zzint/myproject-0.0.1-SNAPSHOT-plain.war

 

소스 전문

(개인 환경이 포함된 소스는 한글로 치환하였습니다)

#!/bin/bash
PWD=`pwd`
WEB_DIR=war파일이 들어갈 경로
BACKUP_DIR=$WEB_DIR/backup

# 첫번째로 입력받을 변수
FILE_TO_APPLY=$1

# 두번째로 입력받을 변수
IS_TAIL=$2

# 현재시간을 20220527190517 형식으로 변수에 담음(백업에 사용)
NOW_TIME=`date +%Y%m%d%H%M%S`

# 파일 경로를 /(슬래쉬) 대신 공백으로 치환한다
FILE_NAME_SPLIT=`echo "$FILE_TO_APPLY" | tr "\/" " "`
# 파일 경로를 배열 변수에 넣는다
FILE_NAME_LIST=(`echo "$FILE_TO_APPLY" | tr "\/" "\n"`)
# 배열의 사이즈를 구한다
FILE_NAME_SIZE=${#FILE_NAME_LIST[@]}
# 공백을 기준으로 맨 끝(사이즈의 크기) 순서에 있는 덩어리를 가져온다(확장자를 포함한 파일명이 됨)
FILE_NAME=`echo "$FILE_NAME_SPLIT" | awk '{print $'"$FILE_NAME_SIZE"'}'`

# 파일 경로를 입력하지 않으면 튕겨냄
if [ -z "$FILE_TO_APPLY" ]; then
    echo "FILE_TO_APPLY is empty"
    exit 0
fi

# 입력한 정보가 절대경로로 입력한 것인지, 상대경로로 입력한 것인지 판단하기 위함
if [[ "$FILE_TO_APPLY" == *\/* ]]; then
        echo "target file : $FILE_TO_APPLY"
    else
        FILE_TO_APPLY=$PWD/$FILE_TO_APPLY
        echo "target file : $FILE_TO_APPLY"
fi


# stop
sudo systemctl stop 정지할프로세스

# backup
rm -rf $BACKUP_DIR/WEB-INF $BACKUP_DIR/META-INF
mv $WEB_DIR/WEB-INF $WEB_DIR/META-INF $BACKUP_DIR/
tar -zcvf $BACKUP_DIR/backup_${NOW_TIME}.tar.gz $BACKUP_DIR/WEB-INF $BACKUP_DIR/META-INF

# move file to apply
rm -rf $WEB_DIR/*.war
cp -rp $FILE_TO_APPLY $WEB_DIR/

cd $WEB_DIR

jar xvf $WEB_DIR/$FILE_NAME
chown -R 권한:권한 $WEB_DIR/WEB-INF $WEB_DIR/META-INF

rm -rf $WEB_DIR/$FILE_NAME

# start
sudo systemctl start 시작할 프로세스

# 두번째 입력받는 변수에 tail을 넣으면 로그를 출력한다
if [ "$IS_TAIL" == "tail" ]; then
    tail -f $WEB_DIR/logs/원하는 로그파일.log
fi

 

 

반응형
복사했습니다!