OS

[WAS] tomcat이 메모리 부족으로 OOM Killer에 의해 중지될 때 톰켓 자동 재시작 하는 방법 ( 톰켓 여러개 일때 )

 각 Tomcat이 다른 디렉토리에 있다는 가정하에, 디렉토리 기준으로 순회하면 됩니다.

아래는 /usr/local/ 안의 tomcat_* 폴더를 자동으로 찾아서, 죽은 것만 재시작하는 스크립트입니다.

완성 스크립트 (제외 목록 방식)

#!/bin/sh

Log=/usr/local/tomcat_monitor.log
DATE=`date +%Y%m%d-%H%M%S`

# ★ 제외할 톰캣 목록 (필요시 추가/수정)
EXCLUDE="tomcat_dev tomcat_test"

# /usr/local/ 아래 모든 tomcat_* 디렉토리 찾기
TOMACT_DIRS=$(ls -d /usr/local/tomcat_* 2>/dev/null)

if [ -z "$TOMACT_DIRS" ]; then
    echo "$DATE : /usr/local/ 아래 tomcat_* 디렉토리가 없습니다." >> $Log
    exit 1
fi

for CATALINA_HOME in $TOMACT_DIRS
do
    NAME=$(basename $CATALINA_HOME)

    # ★ 제외 목록에 있는 톰캣은 건너뜀
    echo "$EXCLUDE" | grep -w "$NAME" > /dev/null 2>&1
    if [ $? -eq 0 ]; then
        echo "$DATE : [$NAME] 제외 대상 (모니터링 생략)" >> $Log
        continue
    fi

    # 해당 톰캣 프로세스 확인 (경로 기준 정확 매칭)
    PID=$(ps -ef | grep "[o]rg.apache.catalina.startup.Bootstrap" | grep "$CATALINA_HOME" | awk '{print $2}')

    if [ -n "$PID" ]; then
        echo "$DATE : [$NAME] 정상 작동 중 (PID: $PID)" >> $Log
    else
        echo "$DATE : [$NAME] 죽어있음! 재시작합니다..." >> $Log

        $CATALINA_HOME/bin/startup.sh
        sleep 5

        NEW_PID=$(ps -ef | grep "[o]rg.apache.catalina.startup.Bootstrap" | grep "$CATALINA_HOME" | awk '{print $2}')

        if [ -n "$NEW_PID" ]; then
            echo "$DATE : [$NAME] 재시작 성공 (PID: $NEW_PID)" >> $Log
        else
            echo "$DATE : [$NAME] 재시작 실패!! 수동 확인 필요" >> $Log
        fi
    fi

    sleep 2   # 톰캣 간 재시작 부하 방지
done

echo "##############################################################################" >> $Log

동작 방식

/usr/local/
├── tomcat_front → 죽으면 재시작
├── tomcat_admin → 정상이면 패스
├── tomcat_api → 죽으면 재시작
├── tomcat_web → 정상이면 패스
└── …

ls -d /usr/local/tomcat_* → tomcat_로 시작하는 모든 디렉토리 자동 탐색


사용 방법

1. 파일 저장

*.bashShell

vi /usr/local/bin/tomcat_monitor.sh

2. 실행 권한 부여

*.bashShell

chmod +x /usr/local/bin/tomcat_monitor.sh

3. 수동 실행 (테스트)

*.bashShell

/usr/local/bin/tomcat_monitor.sh

4. 크론 등록 (5분마다)

*.bashShell

crontab -e

*.bashShell

*/5 * * * * /usr/local/bin/tomcat_monitor.sh > /dev/null 2>&1

설정 변경 포인트

항목위치설명
제외 목록EXCLUDE="..."공백으로 구분, 추가/삭제 자유
로그 파일Log= 줄원하는 경로로 변경 가능
재시작 대기 시간sleep 5톰캣 기동 시간에 맞게 조정
톰캣 간 간격sleep 27개 동시 재시작 시 부하 방지

로그 예시

*.txtPlaintext

20260901-103000 : [tomcat_front] 정상 작동 중 (PID: 12345)
20260901-103000 : [tomcat_admin] 정상 작동 중 (PID: 12346)
20260901-103000 : [tomcat_test] 제외 대상 (모니터링 생략)
20260901-103000 : [tomcat_api] 죽어있음! 재시작합니다...
20260901-103010 : [tomcat_api] 재시작 성공 (PID: 22345)
##############################################################################

제외 목록에 추가로 필요한 톰캣이 있으면 EXCLUDE에 넣기만 하면 됩니다.


[연관자료]

Hi, I’m 관리자