🔷 리눅스 시스템에서 시간 기반으로 작업을 예약하는 데 사용되는 스케줄러
표
나 스케줄
을 관리💡 윈도우의 스케줄러를 안다면 이해하기 쉬울 것이다.
🔷 원래는 데이터 전처리 및 데이터베이스 최신화 스케줄링과 상권 데이터 API 제공을 위해 Django
를 쓰려 했었다.
Springboot
에서 제공하는 것으로 계획이 수정되었다.이렇게 되니, Django
서버를 일주일에 한번 스케줄링 용으로만 열게 되어 리소스를 낭비하는 상황이 되었다...
🔷 그래서 찾게 된 Django
를 대체할 스케줄러, Crontab
을 사용하는 이유는?
1. 자동화
2. 시간 절약
3. 정확성
4. 기록 유지
Crontab
로그를 통해 작업의 실행 기록을 확인할 수 있다.Django
를 엶으로서 얻는 이점을 똑같이 가지고 있으면서, Django
와 다르게 별도의 서버를 필요로 하지 않아 이를 채택하게 되었다.
❗ 필자는
EC2
내Ubuntu
환경에서Docker
컨테이너를 통한 배포를 진행 중이다.
💡
Python script
를crontab
을 통해 주기적으로 실행하는 방법이다.
1) 터미널을 열고 패키지 리스트를 업데이트한다.
sudo apt update
2) 필자는 특정버전인 Python3
설치를 위해 Python PPA
도 추가하였다.
sudo add-apt-repository ppa:deadsnakes/ppa
❗ 특정 버전 설치를 위해서는 Python PPA가 필수이다.
3) 다시 패키지 리스트를 업데이트한다.
sudo apt update
4) Python을 설치한다.
sudo apt install python3.12
5) 설치가 되었는지 확인한다.
python3 --version
출력이 나오면 성공이다.
1) 크론탭 명령어
crontab -l #예약된 작업리스트 확인
crontab -e #예약된 작업 수정
crontab -r #예약된 작업 삭제
crontab -u 사용자명 #해당 사용자 crontab 파일 조회, 편집, 삭제 가능
2) Wildcard
-
: 범위 ex) MON-SAT
*
: 모든 값
?
: 값이 없음
.
: 여러 값 지정 ex) MON,FRI,SAT
/
: 시작시간 / 단위 ex) 0분부터 10분마다 = 0/10
L
: 마지막 날짜 혹은 요일
W
: 지정한 날짜 기준 가장 가까운 평일 ex) 10일에서 가장 가까운 평일 = 10W
#
: 주차와 요일 ex) 첫번째 주 일요일 = 0#1
3) crontab 문법
* * * * * {파일 실행 명령어} {파일 절대 경로}
* * * * *
: 순서대로 분(0~59), 시간(0~23), 일(1~31), 월(1~12), 요일(1~6은 월~토, 0과 7은 일요일)
{ 파일 실행 명령어 }
: which python3
명령어를 입력하면 나오는 경로를 넣는다.
{ 파일 절대 경로 }
: 실행할 파일의 절대 경로를 넣는다.
💡 절대 경로 찾기
sudo find / -type f -name "파일명"
로 찾거나
또는sudo apt-get install mlocate
로 locate 명령어를 설치한 후
sudo updatedb
이후locate 파일명
을 입력하여 찾을 수 있다.
💡 헷갈리면 http://www.cronmaker.com/ 에서 쉽게 만들 수 있다.
4) 문법 예시
crontab -e
명령어 이후 커맨드를 입력한다.
0 4 * * 1 /usr/bin/python3 /home/jenkins/workspace/autoApiPreProcessing.py
💡 주기 설정 시 모두 * 설정을 하면 매 분 실행한다. 범위 설정 시 간격을 설정하지 않으면 범위 내에서 매 분 실행한다.
5) 로깅이 필요할 때
0 4 * * 1 /usr/bin/python3 /home/jenkins/workspace/autoApiPreProcessing.py
> /home/jenkins/python.sh.log 2>&1
>
를 >>
로 교체 시 누적으로 로그가 쌓인다.6) cron service 실행
sudo service cron start
sudo service cron status #실행 확인
완료되면 이제 해당 파일은 지정한 주기마다 반복하여 실행된다.
crontab은 데이터의 신선도를 챙기고 개발자들의 생산성을 향상시키는 좋은 밑거름이 되어주었다.
최신 데이터가 중요한 프로젝트였던 만큼 최소한의 비용으로 데이터를 최신화시키는 것이 중요했는데 그 고민을 단번에 해결해주었다.
언제나 새로운 서버를 여는 것만이 정답은 아니라는 것을 새삼 깨닫고 간다.