쉘 스크립트란(+deploy.sh)

devdo·2023년 3월 2일
0

Linux

목록 보기
4/6
post-thumbnail

쉘 스크립트란?

SHELL에서 사용할 수 있는 shell 명령어들의 조합으로 모아서 만든 배치(Batch)파일이다.

운영체제의 Shell을 이용하여 순차적으로 읽으면서 명령어들을 실행시켜주는 인터프리터 방식의 프로그램이다.

리눅스 명령어들을 모아 놓은 ASCII text 파일
실행 permission을 할당해야 실행 가능


Shell이란?

  • 사용자 명령어 해석기
  • 사용자 프롬프트에 입력한 명령어를 해석해서 운영체제(kernel)에게 전달합니다.


Shell의 종류

1) Bourne shell(sh) - AT&T 벨 연구소의 스티븐 본(Stephen Bourne)이 개발한 Original shell

2) C Shell(csh, tcsh) - Bill Joy가 C언어의 기술을 넣어서 만든 Shell, C언어의 문법을 적용
History, aliases, job control, vi command editing and completion 기능을 포함

3) Korn shell(ksh) - David Korn이 AT&T에서 기존 bourne shell에 csh의 기능을 포함시켜 생성

4) Bourne-again shell(bash) - GNU Project로 만들어졌고, csh, ksh이 가진 기능을 포함하면서 bourne shell과 호환성을 많이 높이 shell로 리눅스, MAC OS의 기본 shell이고 Winodw에서도 사용가능(git bash)

5) zsh - macOS에서 사용하는 쉘로 유명함(물론 zsh도 window에서도 사용가능), zsh는 bash보다 일부 기능에서 더 나은 성능을 제공


Shell 명령어

Shell 확인

# 사용 가능한 shell 리스트 확인하기
$ cat /etc/shells

# 현재 작업 shell 확인
$ echo $SHELL

# 로그인 Shell 변경
$ cat /etc/password
$ chsh

Shell 변수

$ fname=dsg

$ echo $fname
// dsg 

Shell 환경변수

  • 동작되는 프로그램에서 영향을 주는 변수
  • 환경 변수 선언: expert varName=value
 $ export NAME=dsg
 $ export $NAME
  • 시스템에 적용된 환경 변수 확인: env

    $ env
  • 기억해야 할 환경변수

    PATH : 명령어 탐색경로
    HOME : 홈디렉토리의경로. cd 명령 실행시 적용
    USER : 로그인 사용자 이름
    SHELL : 로그인 shell의 이름

💖 환경변수 영구 적용

export를 사용해 환경변수를 넣어주는 방법은 일시적인 방법이다. 시스템을 재부팅하거나, 다음에 다시 로그인하면 환경변수는 사라져 있을 것이다.
영구적으로 모든 사용자가 계속 사용할 수 있는 환경변수를 적용하고자 하면 ,
/etc/bash.bashrc 파일 수정
/etc/bash.bashrc 파일 마지막에 export NAME=dsg 와 같은 식으로 적어주면 되겠다.


예시

쉘 스크립트 파일은 .sh 확장자를 사용

대표적인 예시를 보면, 톰켓에 대한 배치파일이 있는데

일반적으로 톰켓을 사용하는 방식은 IDE에 톰켓을 설정하거나
Spring Boot의 내장톰켓을 사용한다. 하지만 이것 이외에 cmd를 통하여 톰켓의 실행 배치파일을 실행하면 된다.

#!/bin/bash : 스크립트를 실행할 sub shell 이름


# 실행권한을 줘야 한다.
sudo chmod +x test.sh

# 쉘 스크립트 실행
./test.sh

test0.sh

# 주석은 '#'으로 시작합니다
#!/bin/bash

name="John"
echo "Hello, $name"

test.sh

#!/bin/bash  

echo "=========================="
echo "Today is $(date)"
echo "=========================="
df -h 

조건문

#!/bin/bash

if ! [ -d bak ]; then
    echo "bak 폴더를 생성합니다."
    mkdir bak
fi
cp *.log bak
echo "log파일 백업 완료."

반복문

#!/bin/bash

for i in {1..5}
do
  echo "Number $i"
done

함수

#!/bin/bash

my_function() {
  echo "Hello from function"
}

my_function

인자

#!/bin/bash

echo "First argument: $1"
echo "Second argument: $2"
./script.sh arg1 arg2

예외처리

#!/bin/bash

command_that_may_fail

if [ $? -eq 0 ]; then
  echo "Command succeeded"
else
  echo "Command failed"
fi

✳️ deploy.sh

#!/bin/bash
# 1 배포할 JAR 파일이 저장될 경로를 정의합니다.
DEPLOY_PATH=/home/ubuntu
PROJECT_NAME=docker-test


# 2
echo "> Git Repository로 이동" 
cd $DEPLOY_PATH/$PROJECT_NAME/

# 3
echo "> Git Pull"
git pull origin main


# 4
echo "> 프로젝트 Build 시작"
./gradlew clean build


# 5
echo "> Build 파일 복사"
# 빌드된 JAR 파일을 배포 경로로 복사합니다.
cp $DEPLOY_PATH/$PROJECT_NAME/build/libs/*.jar $DEPLOY_PATH/


# 6
echo "> 현재 구동중인 애플리케이션 PID 확인"

# PROJECT_NAME을 포함하는 JAR 파일의 PID를 찾습니다.
CURRENT_PID=$(pgrep -f ${PROJECT_NAME}.*.jar)

echo "현재 구동 중인 애플리케이션 PID: $CURRENT_PID"


# 7
# 현재 구동 중인 애플리케이션이 있는지 확인하고, 있다면 종료합니다.
if [ -z "$CURRENT_PID" ]; then
    echo "> 현재 구동 중인 애플리케이션이 없으므로 종료하지 않습니다."
else
    echo "> kill -15 $CURRENT_PID"
    kill -15 $CURRENT_PID
    sleep 5 # 애플리케이션이 완전히 종료될 때까지 잠시 대기합니다.
fi

# 8
echo "> 새 애플리케이션 배포"
# 배포 경로에서 가장 최근에 생성된 JAR 파일을 찾습니다.
JAR_NAME=$(ls -tr $DEPLOY_PATH/ | grep jar | tail -n 1)

echo "> JAR Name: $JAR_NAME"
# 새 JAR 파일을 백그라운드에서 실행합니다.
# --spring.profiles.active=prod: Spring Boot 애플리케이션을 'prod' 프로파일로 실행합니다.
# 2>&1 &: 표준 출력과 표준 에러를 백그라운드로 보냅니다.
nohup java -jar $DEPLOY_PATH/$JAR_NAME --spring.profiles.active=prod 2>&1 &


참고

profile
배운 것을 기록합니다.

0개의 댓글