삼분공부/Server

[Server] 무중단 배포 중 동일 프로세스 중복 문제 해결하기

케이쓰리 2025. 3. 25. 13:59

무중단 배포를 진행하는 과정에서 동일한 Java 애플리케이션 프로세스가 두 개 떠서 충돌하는 경우가 발생할 수 있습니다. 이러한 문제를 해결하기 위해 불필요한 프로세스를 종료하는 방법에 대해 알아보겠습니다.

🛑 문제 상황

무중단 배포 시 새로운 애플리케이션 인스턴스를 실행하다가 기존 인스턴스가 종료되지 않아 두 개의 프로세스가 동시에 떠 있는 상황이 발생할 수 있습니다. 이러한 경우 서비스 장애를 유발할 수 있으므로 빠르게 하나의 프로세스를 종료해야 합니다.


🔍 프로세스 확인하기

먼저 현재 실행 중인 Java 프로세스를 확인합니다.

ps -ef | grep java

결과 예시

user  12345  1  0  15:10  pts/0  00:01:23  java -jar myapp-1.0.jar
user  12346  1  0  15:12  pts/0  00:01:10  java -jar myapp-1.0.jar

위와 같이 동일한 애플리케이션이 두 번 실행된 경우를 확인할 수 있습니다.


💡 PID(Personal IDentification) 확인하기

프로세스를 구별하기 위해 PID를 확인합니다. PID는 프로세스의 고유 ID로 각 줄의 두 번째 열에 표시됩니다.

PID 추출하기

ps -ef | grep java | grep myapp | awk '{print $2}'

💀 프로세스 종료하기 (Kill 명령)

아래와 같이 kill 명령어를 사용하여 하나의 프로세스를 종료합니다.

kill 12345

강제로 종료할 경우

때때로 정상 종료되지 않는 경우가 있으므로, 강제 종료를 사용할 수 있습니다.

kill -9 12345

모든 동일 프로세스 종료

모든 중복 프로세스를 한 번에 종료하고 싶다면 다음 명령어를 사용합니다.

ps -ef | grep java | grep myapp | awk '{print $2}' | xargs kill -9

🚀 프로세스 종료 확인

다시 프로세스를 확인하여 종료 여부를 체크합니다.

ps -ef | grep java

정상적으로 하나의 프로세스만 남아 있다면 문제 해결 완료입니다.


🛑 안전한 종료 방법 (Spring Boot Shutdown Endpoint 활용)

Spring Boot 애플리케이션에서는 Actuator를 활용하여 안전하게 애플리케이션을 종료할 수 있습니다. 아래와 같이 설정하여 무중단 배포 중 충돌 문제를 줄일 수 있습니다.

1. Actuator 의존성 추가 (build.gradle)

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-actuator'
}

2. application.yml 설정

management:
  endpoints:
    web:
      exposure:
        include: shutdown

3. 안전한 종료 명령어

애플리케이션이 실행 중인 서버에서 다음 명령어로 안전하게 종료할 수 있습니다.

curl -X POST http://localhost:8080/actuator/shutdown

🔒 보안 주의: Actuator를 외부에서 접근 가능하도록 설정하는 경우, IP 제한이나 인증을 반드시 설정해야 합니다.

4. 종료 확인

ps -ef | grep java

정상적으로 프로세스가 종료되었는지 다시 한 번 확인합니다.