본문 바로가기
사이드 프로젝트/To-do 캘린더 프로젝트

Spring boot 프로젝트 AWS 배포 스크립트 오류(3)

by Baley 2022. 9. 1.

 

https://catch-115.tistory.com/entry/AWS-%EB%B0%B0%ED%8F%AC-%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%98%A4%EB%A5%982

 

AWS 배포 스크립트 오류(2)

2. -.jar 파일 실행 시 Permission Denied 에러 https://catch-115.tistory.com/entry/AWS-%EB%B0%B0%ED%8F%AC-%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%8B%A4%ED%96%89-%EC%98%A4%EB%A5%98 AWS 배포 스크립트..

catch-115.tistory.com

위의 포스팅처럼 chmod +x 명령어로 jar 파일의 실행 권한을 주면 실행은 되지만

캡처 1

캡처 1과 같이 cannot execute binary file 에러가 뜬다.

하지만 jar 파일을 읽지 못해서 나오는 에러라고는 보기 힘든 것이 

캡처 2
캡처 3

java -jar [jar파일명]
nohup java -jar [jar파일명]

위의 두 명령어를 입력했을 때는 jar 파일이 실행되어 Spring Boot가 실행된다.

 

그럼 cannot execute binary file 에러를 일으키는 deploy.sh의 파일을 살펴보자.

#!/bin/bash

REPOSITORY=/home/ec2-user/app/step1
PROJECT_NAME=smallBeginJava11

cd $REPOSITORY/$PROJECT_NAME/

echo "> Git Pull"

git pull

echo "> 프로젝트 Build 시작"

./gradlew build

echo "> step1 디렉토리로 이동"

cd $REPOSITORY

echo "> Build 파일 복사"


cp $REPOSITORY/$PROJECT_NAME/build/libs/*.jar $REPOSITORY/

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

CURRENT_PID=$(pgrep -f ${PROJECT_NAME}.*.jar)

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

if [ -z "$CURRENT_PID" ]; then
        echo "> 현재 구동 중인 애플리케이션이 없으므로 종료하지 않
습니다."
else
        echo "> kill -15 $CURRENT_PID"
        kill -15 $CURRENT_PID
        sleep 5
fi

echo "> 새 애플리케이션 배포"

JAR_NAME=$(ls -tr $REPOSITORY/*.jar | tail -n 1)

echo "> JAR Name: $JAR_NAME"

nohup java -jar\
        -Dspring.config.location=/home/ec2-user/app/application.properties \
        $JAR_NAME 2>&1 &

http://www.yes24.com/Product/Goods/83849117

 

스프링 부트와 AWS로 혼자 구현하는 웹 서비스 - YES24

가장 빠르고 쉽게 웹 서비스의 모든 과정을 경험한다. 경험이 실력이 되는 순간!이 책은 제목 그대로 스프링 부트와 AWS로 웹 서비스를 구현한다. JPA와 JUnit 테스트, 그레이들, 머스테치, 스프링

www.yes24.com

책에 적힌 내용과 거의 같지만 몇 가지 수정사항이 있다.

 

책의 배포 스크립트와 내가 작성한 배포 스크립트의 차이점

  1. Dspring.config.location에 클래스 패스를 포함한 application.properties의 위치는 빼고 ec2 서버에 직접 작성한 application.properties의 절대 경로만 입력했다.
  2. JAR_NAME=$(ls -tr $REPOSITORY l grep jar | tail -n 1) 를 JAR_NAME=$(ls -tr $REPOSITORY/*. jar | tail -n 1)로 변경 : 변경 전에는 확장자를 포함한 파일명이 jar로 끝나는 모든 파일에서 수정된 시간이 빠른 기준으로 할 때 가장 마지막의 것을 가져온다. 결국 가장 최근에 수정된 파일을 가져온다. 변경 후에도 가장 최근에 수정된 파일을 가져오는 것은 맞지만 JAR_NAME 변수에 REPOSITORY 변수의 값이 앞에 추가된다.
  3. 2의 변경 사항을 토대로 배포 스크립트의 맨 마지막은 48번째 줄을 실행하기 위해 원래는$REPOSITORY/$JAR_NAME 2>&1 & 였던 것을 $JAR_NAME 2>&1 & 로 변경했다. 

 

굳이 바꾼 이유는

캡처 5

No such file or directory 에러가 났기 때문이다.

 

Error : 48번째 줄 : $JAR_NAME 2>&1 &

48번째 줄을 실행할 때 cannot execute binary file 에러가 난다.

캡처 6

현재 변수 $REPOSITORY의 값은 /home/ec2-user/app/step1이고
변수 $PROJECT_NAME의 값은 smallBeginJava11, 변수  $JAR_NAME의 값은 /home/ec2-user/app/step1/smallBeginJava11-0.0.1-SNAPSHOT.jar 이다.

그러니까 실제로 실행된 건

nohup java -jar /home/ec2-user/app/step1/smallBeginJava11-0.0.1-SNAPSHOT.jar

이란 의미인데 원인을 알 수 없어

PSFTP로 인텔리제이에서 생성한 jar 파일을 직접 넣어줬더니 같은 오류가 발생하지 않는다.

rm 명령어로 직접 넣어준 jar 파일을 삭제하고 다시 실행해도 마찬가지이다.

 


#  참고: 리눅스 명령어 grep 설명:

https://www.daleseo.com/shell-command-ls/

 

ls 쉘 커맨드 사용법

Engineering Blog by Dale Seo

www.daleseo.com

# 참고: 리눅스 명령어 tail 설명:

https://ts2ree.tistory.com/56

 

리눅스 기초 명령어3 - ll, ls -R, ls -F

cal > bb : ( > 를 redirection 이라 부른다.) 달력을 bb 라는 파일에 저장하는 것 ll : ls 란 해당 디렉토리에 존재하는 파일목록을 표시해주며, ll 이란 ls 명령어에 -l 옵션을 준 형태이다. (참고로, -l 옵션

ts2ree.tistory.com

 

 

 

댓글