보통사람

[오류] 톰캣 프로세스 여러개 뜨는 경우 본문

오류

[오류] 톰캣 프로세스 여러개 뜨는 경우

pej4303 2023. 8. 12. 00:45
환경버전

개발툴 : 이클립스
Spring : 4.3.3
Quartz : 2.3.0
Tomcat : 8.5  
서버 :CentOS

1. 오류

개발서버에서 톰캣 프로세스가 여러개가 뜨면서 메모리 너무 많이 잡아먹는 현상이 발생하였다.

netstate -tnlp 하면 8080포트는 하나만 나오고, ps -ef | grep tomcat 하면 여러개 나왔다.

 

2. 원인

검색을 하다가 아래의 글을 보고 quartz 스케쥴러의 문제라고 생각이 들었다.

톰캣 서버가 종료되어도 이미 실행된 job 스레드는 종료되지 않고 계속 남는다.

 

 

[Tomcat] 톰켓 프로세스 종료 이슈 (shutdown 시 PID 남음)

이슈 내용 Tomcat을 종료하는 스크립트(shutdown.sh)를 실행했지만 프로세스가 죽지 않고 그대로 남는다. netstate -tnlp 상으로는 확인되지 않고, ps -ef 상으로는 PID 번호가 확인된다. 기존 프로세스를 kil

log4day.tistory.com

3. 해결

destroy-method 속성을 이용해서 SchedulerFactoryBean 클래스에 있는 destroy() 메소드를 추가해줬다.

<bean id="qcrmJobScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" destroy-method="destroy">
    <property name="triggers">
        <list>
            <ref bean="testJobTrigger" />
        </list>
    </property>
</bean>

 

하지만 모든 job을 종료시키는 destroy() 메소드는 빈 소멸시 자동으로 호출되는 것 같은데, 왜 실행되지 않았던걸까? 

/**
 * Shut down the Quartz scheduler on bean factory shutdown,
 * stopping all scheduled jobs.
 */
@Override
public void destroy() throws SchedulerException {
    if (this.scheduler != null) {
        logger.info("Shutting down Quartz Scheduler");
        this.scheduler.shutdown(this.waitForJobsToCompleteOnShutdown);
    }
}

 

+ 추가(2023.10.13)

위 방법으로 적용 후에도  계속 발생하여 젠킨스 배포시 실행중인 톰캣 프로세스 모두 종료시키는 쉘 스크립트를 추가하였다.

#!/bin/bash

tomcat_pids=$(ps aux | grep tomcat | grep java | grep -v grep | awk '{print $2}')

if [ -n "$tomcat_pids" ]; then
    for pid in $tomcat_pids; do
        echo "PID: $pid"
        kill -9 $pid
    done
fi

 

참조