Programming/CentOS

[CentOS] 프로세스 우아하게 죽이기 (graceful shutdown process)

통통만두 2021. 7. 16. 21:37
반응형
#!/bin/sh

if [ -z "$1" ]
then
    echo "사용법 : gracefulShutdown process"
    exit
fi

target=$1
loop=1
limitLoop=30

ps -ef | grep $target | grep -v grep | grep -v vi | grep -v sh | awk '{ print $2 }' | \
while read PID
do
    echo "[$PID] 프로세스에 종료 신호를 전송합니다."
    kill -15 $PID
done

while [ $loop -le $limitLoop ]
do
    PID_LIST=(`ps -ef | grep $target | grep -v grep | grep -v vi | grep -v sh | awk '{ print $2 }'`)

    if [ ${#PID_LIST[@]} = 0 ]
    then
        echo "프로세스가 완전히 종료되었습니다."
        exit
    else
        for pid in "${PID_LIST[@]}"
        do
            echo "[$loop/$limitLoop] $pid 프로세스 종료를 기다리는중입니다."
        done

        loop=$(( $loop + 1 ))
        sleep 1
        continue
    fi
done

echo "!!! 대기시간이 만료되었습니다. 강제종료를 시도합니다. !!!"
ps -ef | grep $target | grep -v grep | grep -v vi | grep -v sh | awk '{ print $2 }' | \
while read PID
do
    echo "[$PID] 프로세스에 강제종료 신호를 전송합니다."
    kill -9 $PID
done

CentOS에서 톰캣을 종료할 때 ./shutdown.sh 명령어로 kill을 하는게 보통입니다.

하지만 저 명령어를 실행한다고해도 톰캣이 바로 죽지는 않습니다. 물론, 바로 죽을 때도 있지만 무언가를 수행하고 있을 경우에는 바로 죽지 않습니다. ./shutdown.sh 명령어는 단지 톰캣에 종료 신호를 보내는 것일 뿐입니다.

그래서 ./shutdown.sh를 한 후에 바로 ./startup.sh를 실행했을 경우에 이미 톰캣이 실행 중인 경우에는 해당 port가 사용중이여서 정상적으로 톰캣이 구동이 되지 않는 경우가 있습니다.

위의 소스코드를 스크립트 파일로 만든 후 실행하면 해당 프로세스(톰캣)이 죽을 때까지 기다립니다. 이 때, 지정한 시간(30초) 동안에 죽지 않았을 경우에는 kill -9 $PID를 통해서 강제로 프로세스를 종료하게 됩니다. 강제로 프로세스를 종료하게 되었을 경우에는 작업 중이던 내용을 유실할 수 있음을 참고하세요.

반응형

'Programming > CentOS' 카테고리의 다른 글

[CentOS] JAVA 설치  (0) 2021.07.16
[CentOS] n일 지난 톰캣 로그 삭제 및 crontab 등록  (0) 2021.07.15