bash shell script로 무정지 Yolov4 만들기-exception error 대처법
본문 바로가기
VAS/Centos 7 개발환경 구축

bash shell script로 무정지 Yolov4 만들기-exception error 대처법

by Migos 2021. 11. 15.
반응형

yolo기반 시스템에서 네트워크 장애 혹은 디바이스 에러(GPU, Camera)가 발생한 경우를 대비하는 것이 중요하다.

Exception에 대한 에러 처리는 다음과 같이 간단하게 진행된다.

 

타겟 PID모니터링(1sec) - 에러발생 - RestAPI전송(알림) - 재실행

 

처음에는 에러 발생하는 코드 부분에 if False == Do something 방식으로 exception을 다루려고 했으나 그러기에는 어느부분에서 에러가 튀어나올지 모르기 때문에 그냥 커멘드 창에서 yolo가 죽어버리면 다시 실행해주는 시스템을 만들기로 했다.

 

우선 yolov4 기준으로 설명하겠다. 아래 폴더디렉토리를 기준으로

1) 아래 링크에서 autorun 폴더를 받고 yolov4 루트 디렉토리에 위치시킨다.

https://www.mediafire.com/folder/uo1d0cfwcuibf/autorun

 

yolov4 전체 디렉토리 모습(src폴더안에 모든 darknet실행코드가 있다)

 

내부폴더모습

 

3) VAS_start.sh 파일은 yolov4를 구동시키는 코드이다.

 

4) VAS_status.sh 파일은 VAS_start.sh가 현재 동작하고 있는지를 감지하는 시스템이고, 만약 동작하지 않으면 재실행 해주는 bash script라고 이해하면 된다.

 

 

코드를 각각 살펴보자.

VAS_start.sh

바꿀부분

cd /home/dpw/Python/envs <<이부분은 파이썬 가상환경 폴더
source test/bin/activate <<이부분은 파이썬 가상환경 실행
python /home/dpw/codes/Westports/westport_VAS/src/main.py <<이부분은 YOLOV4 RUN COMMAND로 바꿔주면됨.

#! /bin/bash
### YOLOV4 AUTORUN!
echo "가상환경폴더로 갑시당~"
cd /home/dpw/Python/envs

echo "test라는 가상환경을 activation해줍니다~"
source test/bin/activate

echo "YOLOV4를 구동해줍니다."
python /home/dpw/codes/Westports/westport_VAS/src/main.py

echo "구동이 완료되었습니다."
exit 0

 

VAS_status.sh 

바꿀부분

Log= 디렉토리 경로 수정

NORMAL_SLEEP= x(초)

PROB_SLEEP= x(초)

Cnt=`ps -ex|grep VAS_start|grep -v grep|wc -l`

/home/dpw/codes/Westports/westport_VAS/autorun/VAS_start.sh &

#!/bin/sh
#: Title	: Check VAS status script
#: Date 	: 2021-11-12
#: Author	: "Min Kim" <Min.Kim@dpworld.com>
#: Version	: 1.0
#: Description  : Checking current running VAS and re-start VAS_start.sh script when it dead.
#:		: Please refer to monitor.out logfile.
#:		: LogfileDir = /home/dpw/codes/Westports/westport_VAS/autorun/log/monitor.out


#!/bin/bash

Log=/home/dpw/codes/Westports/westport_VAS/autorun/log/monitor.out
DATE=`date +%Y%m%d-%H%M%S`
NORMAL_SLEEP=1      #정상시 대기 시간
PROB_SLEEP=1        #장애발생시 대기 시간(장애시 곧바로 시작하기 위해)

#Log File Rename
mv -f "$Log" "${Log}_`date +%Y-%m-%d-%H%M`"

echo "#####################################" 
echo "$DATE VAS WESTPORT Monitoring Start!"   
echo "#####################################" 
echo "#####################################" >> $Log
echo "$DATE VAS WESTPORT Monitoring Start!"   >> $Log
echo "#####################################" >> $Log

while [ 1 ]
do
        DATE=`date +%Y%m%d-%H%M%S`

        Cnt=`ps -ex|grep VAS_start|grep -v grep|wc -l`

        if [ $Cnt \< 1 ]
        then
                PROCESS=`ps -ex|grep VAS_start|grep -v grep|awk '{print $1}'`
                if [ "$PROCESS" != "" ]
                then
                        echo "$DATE : 프로세스를 종료합니다." 
                        echo "$DATE : 프로세스를 종료합니다." >> $Log
                        kill -9 $PROCESS
                        wait
                fi

                echo "$DATE : westport_VAS를 재 기동합니다." 
                echo "$DATE : westport_VAS를 재 기동합니다." >> $Log
                 # 여기서 서버를 재기동한다.
		/home/dpw/codes/Westports/westport_VAS/autorun/VAS_start.sh &

                echo "$DATE : westport_VAS를 재 기동 완료." 
                echo "$DATE : westport_VAS를 재 기동 완료." >> $Log

                sleep $PROB_SLEEP

                continue

        else
                echo "$DATE : 정상 작동중 입니다." 
                echo "$DATE : 정상 작동중 입니다." >> $Log
        fi


        sleep $NORMAL_SLEEP

done

위 코드는 로그를 출력도 하고 저장도 하기위해서 불필요하게 >>Log 부분이 중복되어있으니 원하면 삭제해도된다.

반응형

댓글