Profile picture

[Shell Script] 특정 프로세스 상태 확인

JaehyoJJAng2023년 11월 15일

▶︎ 개요

현재 게임 서버를 도커를 이용하여 운영 중이다.

게임 서버 컨테이너가 정상적인지 주기적으로 확인하는 파이썬 스크립트를 작성하였고 아래와 같이 실행하였다.

nohup python3 alarm.py >/dev/null 2>&1 &

그러나 서버가 재기동되면 실행된 위 스크립트 프로세스도 죽어버리기 때문에 수동으로 매번 실행시켜줘야 한다.

이런 번거로운 작업을 해결하기 위해 셸 스크립트를 사용하여 자동화된 환경을 구축해보려고 한다.


‣ 셸 스크립트

{% include codeHeader.html name="stateCheck.sh" %}

#!/usr/bin/bash

now=$(date +"%Y%m%d_%H:%M")
logDir="logs"
logFile="$logDir/$now.log"
scriptPath="/home/$USER/palworld-discord"

if [[ ! -d "$logDir" ]]; then
    echo "[$now] $logDir directory is creating ..."
    mkdir $logDir
fi

exec 3>> "$logFile"

echo "================================" >&3

echo -e "[$now] Python(game server checking) Process run status check & autu run job start" >&3
echo "[$now] First step. check python process" >&3
pythonProcessor=$(ps -ef | grep 'main.py' | grep -v 'grep')
pid=$(echo "${pythonProcessor}" | awk '{print $2}')

echo "[$now] Second step. python process run" >&3
if [[ -n "$pid" ]]; then
    echo "[$now] [🟢 info] python processor status is good" >&3
else
    echo "[$now] python processor status is dead. Try python run" >&3
    source "$scriptPath/dev/bin/activate"
    nohup python3 "$scriptPath/main.py" >/dev/null 2>&1 &

    if [[ $? != 0 ]]; then 
        echo "[$now] [🔴 error] python processor run failed!" >&3
    else 
        echo "[$now] [🟢 info] python processor run success!" >&3
    fi
fi

echo "[$now] python process run status check & auto run job end" >&3
echo "================================" >&3

‣ 코드 설명

pythonProcessor=$(ps -ef | grep 'main.py' | grep -v 'grep')

이 부분을 통해 python 프로세스가 기동 중인지를 확인하려고 한다.

해당 명령어는 띄어쓰기(공백)으로 파이썬 프로세스를 ps -ef 명령어로 검색하여 그 결과를
pythonProcessor 변수에 저장하도록 하였다.

이 때, grep은 검색되지 않도록 grep -v로 제외 시켜주었다.


pid=$(echo "${pythonProcessor}" | awk '{print $2}')

그리고 위 명령어를 통해 pythonProcessor 변수에 담긴 내용을 띄어쓰기(공백)을 기준으로 자르고, 자른 값 중에서 2번째 값을 pid 변수에 저장하였다.

왜냐하면? ps -ef 명령어를 실행하고 나온 결과 값의 2번째 값이 pid 값을 나타내기 때문이다!


if [[ -n "$pid" ]]; then

위 if문에서는 해당 pid 변수에 담긴 값이 0인지 아닌지를 확인하는 작업을 하고있다.

만약 0이 아니라면 참이 되어 아래 echo문을 실행하게 된다!

echo "[$now] [🟢 info] python processor status is good" >&3

하지만 0이라면(=프로세스가 실행 중이지 않다면) 아래 내용을 실행한다.

    echo "[$now] python processor status is dead. Try python run" >&3
    source "$scriptPath/dev/bin/activate"
    nohup python3 "$scriptPath/main.py" >/dev/null 2>&1 &

    if [[ $? != 0 ]]; then 
        echo "[$now] [🔴 error] python processor run failed!" >&3
    else 
        echo "[$now] [🟢 info] python processor run success!" >&3
    fi

Loading script...