본문 바로가기

백엔드

[AWS] spring boot 연결 - 오류 "Port 8080 was already in use"

728x90

EC2로 서버를 구축하면서 스프링 프로젝트를 연결했는데, 처음 연결할 때는 수월하게 진행이 됐으나 코드를 변경하고 재배포하면 변경 내용이 적용되지 않는 경우가 발생했다.

nohup.out 파일을 확인해보니 "Port 8080 was already in use" 오류가 있었다.

 

구글링을 통해 찾아보니 8080 포트가 종료되지 않고 계속 열려있어서 새로운 걸로 덮어씌워지지 않는 것 같았는데 왜 그런지는 잘 모르겠다.

 

수동으로 8080포트를 종료하고 다시 실행하는 방법으로 오류를 해결했다.

리눅스에서 아래 명령어를 작성하면 젤 오른쪽에 [pid]/java 형태가 출력되는데, 여기서 pid를 확인할 수 있다.

netstat -ano | grep 8080

 

찾은 pid를 kill 명령어를 통해 종료한다.

kill -9 [pid 번호]

 

그리고 deploy.sh 파일을 재실행해주면 변경사항이 적용된다.

./deploy.sh

 

 

근데 매번 이렇게 포트를 종료시키자니 번거로워서 scripts 폴더 안의 deploy.sh 파일을 아래처럼 수정했다.

#!/usr/bin/env bash

REPOSITORY=/home/ubuntu/app

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

CURRENT_PID=$(pgrep -fla java | grep hayan | awk '{print $1}')

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

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

echo "> 현재 구동 중인 8080 pid 확인"

CURRENT_PID=$(netstat -tnlp | grep 8080 | awk '{ print $7 }'|grep -o '[0-9]*')

echo "현재 구동 중인 8080 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/*SNAPSHOT.jar | tail -n 1)

echo "> JAR NAME: $JAR_NAME"

echo "> $JAR_NAME 에 실행권한 추가"

chmod +x $JAR_NAME

echo "> $JAR_NAME 실행"

nohup java -jar -Duser.timezone=Asia/Seoul $JAR_NAME >> $REPOSITORY/nohup.out 2>&1 &

deploy.sh 파일 내에서 사용 중인 8080포트를 종료하기 때문에 git에 push만 해주면 자동으로 변경사항이 적용되어 배포된다.

 

 

처음에 이 오류 때문에 인스턴스를 지우고 다시 시작하고 이걸 엄청 반복하면서 삽질했는데.. 역시 오류는 로그를 봐야 해결이 된다.

 

8080 포트는 왜 안닫히는 건지 의문.. 왜 이런 문제가 발생하는지는 후에 제대로 알아봐야할듯.

반응형