용로그
article thumbnail

필자가 CI/CD 파이프라인을 구축하고 사용하는 과정에서 나왔던 문제다. 젠킨스 빌드가 모두 성공했다고 떴는데, 제일 최근에 개발한 기능이 동작하지 않는것이 아니겠는가

 

그래서 급하게 ssh에 접속해서 로그파일을 열어봤다. 

 

직접 kill하기

애초에 배포 스크립트에 만약 8080포트가 열려있다면 지운 후에 실행하도록 작성했는데, 왜 이런 오류가 발생한지 의문이었다. 곧바로 사용중인 8080포트를 찾기 시작했다.

  • lsof -i:8080 : 실패
  • netstat -tulpn | grep 8080 : 실패
  • netstat -ano : 실패
  • ....

애초에 저걸로 성공했으면 이 트러블 슈팅기는 작성하지 않았을 것이다. 있는 명령어 없는 명령어 다 실행하며 8080 포트를 찾으려 노력해봤지만 어디에도 보이지 않았다. 그러던 와중 저~~~번에 에단이 이야기 했던 것이 스쳐 지나갔다.

 

"가끔씩 자바에서 이상한게 막 실행될 때가 있더라고" 아마 기억상으로 자바 관련 포트였던 것 같아서 자바가 사용하는 포트를 확인해봤다.

ssh > ps -ef | grep java
ubuntu      5953    5908  0 Jun02 ?        00:26:16 java -Duser.home=/var/jenkins_home -Djenkins.model.Jenkins.slaveAgentPort=50000 -Dhudson.lifecycle=hudson.lifecycle.ExitLifecycle -jar /usr/share/jenkins/jenkins.war
ubuntu    701368  701358  0 16:04 pts/1    00:00:00 grep --color=auto java

 

우선 젠킨스 포트는 아니다. 만약 저걸 죽이게 된다면 나의 젠킨스 컨테이너가 날아가면서 플러그인부터 다시 설치해야할 것이다. 그렇기 때문에 선택지는 2번째 프로세스 밖에 없다.

 

그리고 kill -9 701358을 입력했다. 곧바로 나의 ssh가 죽어버렸다. 그리고 다시 실행했더니 드디어 된다!

2023-06-16 16:08:36.510 [INFO] [main] [o.s.b.w.e.tomcat.TomcatWebServer] - Tomcat started on port(s): 8080 (http) with context path ''

 

 

배포 스크립트 수정하기 

기존의 배포스크립트는 다음과 같았다.

 

#!/bin/sh
PROJECT_NAME=ProjectName

echo '> 현재 구동중인 애플리케이션 pid 확인'
CURRENT_PID=$(pgrep -f ${PROJECT_NAME}.*.jar)

echo ''
if [ -z "$CURRENT_PID" ]; then
        echo '> 현재 구동 중인 애플리케이션 없음'
else
        echo '> kill -15 $CURRENT_PID'
                sudo kill -15 $CURRENT_PID
        sleep 5
fi

echo ''

sudo chmod +x ProjectName-0.0.1-SNAPSHOT.jar
sudo nohup java -jar \
-Dspring.profiles.active=prod \
-Dspring.config.import=env.properties \
ProjectName-0.0.1-SNAPSHOT.jar > ~/application.log 2>&1 &

 

pgrep 명령을 사용하여 프로세스 이름 또는 패턴을 기반으로 PID를 찾는다. 하지만 위 스크립트에서 8080 포트를 정상적으로 kill 해주지 못했다.

 

어떤 영문인지는 모르겠으나, 무언가 패턴에 문제가 있는 것 같다. 그래서 서버에 존재하는 8080포트를 확실하게 찾기 위해 다음과 같은 명령어로 변경했다.

 

CURRENT_PID=$(sudo netstat -lntp | grep 8080 | awk '{print $7}' | cut -d'/' -f1)

 

최종 배포 스크립트는 다음과 같다.

 

#!/bin/sh
PROJECT_NAME=ProjectName

echo '> 현재 구동중인 애플리케이션 PID 확인'
CURRENT_PID=$(sudo netstat -lntp | grep 8080 | awk '{print $7}' | cut -d'/' -f1)
echo "현재 구동중인 애플리케이션 PID: $CURRENT_PID"

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

sudo chmod +x ProjectName-0.0.1-SNAPSHOT.jar
sudo nohup java -jar \
-Dspring.profiles.active=prod \
-Dspring.config.import=env.properties \
ProjectName-0.0.1-SNAPSHOT.jar > ~/application.log 2>&1 &

 

 

문제를 해결하긴 했지만, ${PROJECT_NAME}.*.jar 명령어의 패턴이 왜 8080 포트를 찾아주지 못하는지는 모르겠다. 별 것 아닌 것 같지만 구글에 암만 찾아봐도 없는 트러블 슈팅기일 것이다.. 만약 같은 문제가 발생하는 분들이라면 꼭 이 글을 빨리 찾으면 좋겠다!

profile

용로그

@용로그

벨덩보단 용덩 github.com/wonyongChoi05