본문 바로가기
IT Life

초저가 잡 스케줄러 구축 (3) : 스케줄러 구현

by 미스터트롤 2021. 9. 9.
반응형

작년 11월쯤 오렌지파이 제로 LTS 버전을 구입해서 우분투 기반 서버 세팅을 했었다. 목적은 제목과 같이 초저가 잡 스케줄러를 구축하기 위한 것이었다.

 

https://mrtroll.tistory.com/587

 

초저가 잡 스케줄러 구축 (1) : 구상과 지름

그동안 지인들의 부탁을 받고 만들어준 웹 어플리케이션이 몇가지 있다. 그 중 일부는 매일 또는 일정시간마다 확인하고 동작해야하는 배치성 작업이 필요한 것들이 있었다. 즉, 주기적인 작업

mrtroll.tistory.com

https://mrtroll.tistory.com/588

 

초저가 잡 스케줄러 구축 (2) : 서버환경설정

이전 포스트에서 초저가 잡 스케줄러를 만들기 위해 어떤 하드웨어와 소프트웨어를 사용할 것인지 결정했었다. 요약하자면 오렌지파이 제로 LTS(Orange Pi Zero LTS)와 우분투 리눅스를 이용해서 잡

mrtroll.tistory.com


그 뒤로 장거리 이사도 있었고, 회사 복귀 후 프로젝트 팀 발령으로 인하여 정신없는 시간을 보냈던 것 같다.

 

그러다 이제야 짬이 좀 나서 다시 오렌지파이를 설치하고 잡 스케줄러 구현을 마무리 한 내용을 기록한다.

 

 

구현 방식

 

처음에는 C++로 직접 구현해서 DB를 활용한 방법을 생각했었다. 

하지만 점점 든 생각이 어차피 crontab을 나중에 활용하게 될텐데 크론탭을 활용하고 로그파일을 남기는 방식이 심플하지 않을까 하는 생각이 들었다.

 

그래서 쉘 스크립트도 꼼지락 거려볼겸, crontab과 curl, 쉘 스크립트를 이용한 방법으로 스케줄러를 구현하고, 모니터링은 php로 웹에서 하는 방식으로 구상하였다. 

 

모니터링은 php기반이고 부트스트랩을 이용해서 반응형 웹을 사용하였다.

 

 

쉘 스크립트 구현

일단 curl을 이용해서 웹주소를 콜하고 결과를 로그로 저장하는 스크립트를 구현했다.

아래코드는 callUrl.sh 의 내용이다.



if [ $# -ne 2 ]; then
        echo "Usage: $0 JOB_NAME URL"
        exit -1
fi

DIR="[로그경로]"
TODAY=$(date "+%Y%m%d")
TODAYDTTM=$(date "+%Y%m%d%H%M%S")

# check jobname dir
if [ ! -d "$DIR/$1/" ]; then
        mkdir "$DIR/$1/"
fi

# check yyyymmdd dir
if [ ! -d "$DIR/$1/$TODAY/" ]; then
        mkdir "$DIR/$1/$TODAY/"
fi

curl -i -X GET "$2" >> "$DIR/$1/$TODAY/$1_$TODAYDTTM.log" 2>&1

로그는 crontab에 등록될 라인별로 Job Id를 부여하고 그 Id별로 폴더와 일자를 생성하도록 했다.

스크립트에서 경로가 존재하지 않으면 자연스럽게 폴더를 추가하도록 했다.

 

웹에서 읽을 것이기 때문에 로그 파일을 읽기 편하도록 웹쪽 경로에 폴더를 하나 지정해두었다.

 

 

크론탭 등록

쉘 스크립트를 구현/테스트를 완료했으니, 이제 크론탭에 등록할 차례.

 

웹에서 파일을 읽기 편하도록 웹 관련 계정에 크론탭을 등록해준다.

 

통상 웹계정은 로그인이 불가능하게 막는것이 일반적이므로, 관리자로 들어가 crontab -e -u 계정ID 를 입력하여 해당 계정의 ID로 크론탭이 동작하도록 한다. 그래야 나중에 웹에서 로그파일을 읽기가 수월하다.

 

스샷에는 오른쪽이 잘려서 나오지 않았지만, 맨 뒤쪽에 #으로 크론잡에 대한 설명을 주석으로 달아놓았다. 이것을 이용해서 나중에 웹 모니터링에 활용했다.

 

 

웹 모니터링 페이지 구현

부트스트랩 무료 템플릿 중 하나를 받아서 활용하였다.

php 코드는 그닥 어려울 것들이 없으니 따로 요청이 있지 않는 이상은 코드보다는 컨셉 위주로..

 

메인 화면에서는 exec('crontab -l', $output, $retval); 을 실행시켜서 크론잡 리스트를 가지고 온 뒤 파싱해서 적당히 보여주도록 구성했다. 그리고 가장 최근에 실행한 시각과 결과를 Last Run에 보여주고, 클릭하면 바로 마지막 실행 로그가 나오도록 링크를 연결했다.

 

그리고 오늘 기준 전체 실행 횟수와 오류 내역을 Today Err 컬럼에 표시하도록 했다.

시각적인 효과를 위해 오류가 0건일때는 초록, 1~5건일때는 노랑, 이상일때는 빨강이 나오도록 했다.

 

메인 화면에서 Job Id를 누르면 년/월/일자 폴더를 선택해서 위 스샷과 같이 특정일자의 로그 리스트와 실행 결과를 확인 할 수 있게끔 세팅했다.

 

특정 로그를 클릭하면 해당 로그 텍스트를 아래와 같이 바로 표시한다.

 

호출이 정상적인지 여부를 판단 하는 것은 HTTP/1.1 200 OK 문자열이 있는지 확인 하는 것으로 일단 구현해 두었다. (정확히는 HTTP/~~~~200 OK의 문자열 패턴을 확인하는 것으로.

 

 

추후 오류내역 발생시 이메일을 발송하는 JOB을 추가할 예정..

반응형