▶︎ 개요
현재 게임 서버를 도커를 이용하여 운영 중이다.
게임 서버 컨테이너가 정상적인지 주기적으로 확인하는 파이썬 스크립트를 작성하였고 아래와 같이 실행하였다.
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