[DevOps] Linux crontab

young-gue Park·2024년 4월 1일
0

DevOps

목록 보기
13/13
post-thumbnail

⚡ Linux Crontab


📌 Crontab(Cron Table)이란?

🔷 리눅스 시스템에서 시간 기반으로 작업을 예약하는 데 사용되는 스케줄러

  • 특정 시간에 반복해서 실행되어야 하는 작업을 위한 스케줄을 관리
  • 백업, 업데이트 및 모니터링과 같은 주기적인 작업을 자동화하기 위해 사용

💡 윈도우의 스케줄러를 안다면 이해하기 쉬울 것이다.


📌 Why Crontab?

🥬 진행중인 프로젝트

🔷 원래는 데이터 전처리 및 데이터베이스 최신화 스케줄링과 상권 데이터 API 제공을 위해 Django를 쓰려 했었다.

  • 첫 번째로, 상권 데이터 API를 모두 Springboot에서 제공하는 것으로 계획이 수정되었다.
  • 두 번째로, 데이터 전처리와 데이터베이스 최신화를 일주일에 한 번 간격으로 하는 것으로 결정하였다.

이렇게 되니, Django 서버를 일주일에 한번 스케줄링 용으로만 열게 되어 리소스를 낭비하는 상황이 되었다...

🔷 그래서 찾게 된 Django를 대체할 스케줄러, Crontab을 사용하는 이유는?

1. 자동화

  • 작업을 자동화함으로써 반복적인 수동 작업의 필요성을 제거할 수 있다.

2. 시간 절약

  • 일정에 맞춰 자동으로 실행되므로, 개발자가 다른 중요한 작업에 집중할 수 있게 해준다.

3. 정확성

  • 수동으로 작업을 실행할 때 발생할 수 있는 인간의 실수를 줄인다.

4. 기록 유지

  • Crontab 로그를 통해 작업의 실행 기록을 확인할 수 있다.

Django를 엶으로서 얻는 이점을 똑같이 가지고 있으면서, Django와 다르게 별도의 서버를 필요로 하지 않아 이를 채택하게 되었다.


📌 Crontab 사용하기

필자는 EC2Ubuntu 환경에서 Docker 컨테이너를 통한 배포를 진행 중이다.

💡 Python scriptcrontab을 통해 주기적으로 실행하는 방법이다.

1. Python3 설치

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

출력이 나오면 성공이다.

2. Crontab 사용

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
  • 매주 월요일 오전 4시 0분 마다 해당 스크립트를 실행하게 된다.

💡 주기 설정 시 모두 * 설정을 하면 매 분 실행한다. 범위 설정 시 간격을 설정하지 않으면 범위 내에서 매 분 실행한다.

5) 로깅이 필요할 때

0 4 * * 1 /usr/bin/python3 /home/jenkins/workspace/autoApiPreProcessing.py
> /home/jenkins/python.sh.log 2>&1
  • 매주 월요일 오전 4시 0분 마다 해당 스크립트를 실행하고 로그를 기록한다.
  • >>>로 교체 시 누적으로 로그가 쌓인다.

6) cron service 실행

sudo service cron start
sudo service cron status #실행 확인

완료되면 이제 해당 파일은 지정한 주기마다 반복하여 실행된다.


마치며...

crontab은 데이터의 신선도를 챙기고 개발자들의 생산성을 향상시키는 좋은 밑거름이 되어주었다.
최신 데이터가 중요한 프로젝트였던 만큼 최소한의 비용으로 데이터를 최신화시키는 것이 중요했는데 그 고민을 단번에 해결해주었다.
언제나 새로운 서버를 여는 것만이 정답은 아니라는 것을 새삼 깨닫고 간다.

profile
Hodie mihi, Cras tibi

0개의 댓글