슬기로운 개발자생활/클라우드

AWS EC2 python 주기적으로 실행 Cron 잡 스케줄러

개발자 소신 2024. 1. 4. 20:29
반응형

본인의 경우 EC2 서버에서 주기적으로 파이썬 스크립트를 실행할 경우, 스크립트 내에서 실행 주기를 관리하기보다 cron을 활용해서 main.py를 주기적으로 실행한다.

Cron

  • 유닉스 계열 컴퓨터 운영체제의 시간 기반 잡 스케줄러

순서

1. cron 초기 설정
2. 시간 설정
3. cron 명령어
4. cron 로그
5. cron 사용 시 주의사항과 에러


1. Cron 초기 설정

터미널에서 다음 명령어 실행

crontab -e

vim editor는 vim.tiny로 설정, 그 외에 에디터는 리눅스 운영체제를 자주 사용하지 않는 나에겐 사용하기 너무 불편함..

에디터를 잘못 설정했다면, 기존 터미널은 휴지통 버튼으로 종료해주고, (닫기 아님)

kill-terminal

터미널에서 select-editor를 입력하여 vim-editor를 변경할 수 있다.

※ 기본적인 vim.tiny 사용법 (모드 명칭 정확하지 않음)

●  마우스는 기본적으로 사용 불가 (키보드만 사용)
●  드래그 사용 불가
●  [보기모드]에서 i 입력 시 [편집모드]로 전환
●  [편집모드]에서 esc 입력 시 보기모드로 전환
●  [보기모드]에서 SHIFT + ; (세미콜론) 으로 [명령모드]로 전환
●  [명령모드]에서 wq (저장 후 닫기) 혹은 q (닫기) 입력 후 ENTER

 

cron-setting


2. 시간 설정

주로 crontab.guru 사이트를 이용
위 사이트에서 스케줄 표현식을 입력하면 다음 실행이 언제인지를 확인할 수 있음

 

기본적으로 표현식은 분 시 일 월 요일로 띄어쓰기로 구분

 

guru-example

위의 표현식을 해석하면,

●  */10 (10분마다)
●  4,8,12 (04시, 08시, 12시에)
●  5-10 5일부터 10일까지 (5, 6, 7, 8, 9, 10일)
●  * * 모든 달, 모든 요일

 

위의 경우 외에는 잘 안쓸듯, 특정 요일만 실행할 것이라면 아래와 같이 표현 (0~6)

 

guru-weekday

매주 금요일 10시에 실행 예시


3. cron 명령어

시간 설정까지 마쳤다면, 파이썬 파일을 실행하도록 해야함

 

cron-command

 

* * * * * /usr/bin/python /home/ubuntu/workspace/main.py
_________ _______________ ______________________________
 시간 설정    파이썬 경로        실행할 파이썬 파일 경로

사실 위의 명령어는 파이썬 파일을 실행할 때의 풀 명령어 (시간 설정 부분 제외하고)

 

우리가 python main.py 라고 쓸 수 있는 이유는
python의 경로를 환경변수로 설정해놓았기 때문
현재 위치가 main.py와 같은 경로상에 있기 때문

 

cron에서는 경로설정 문제때문에 파이썬 설치 경로와 실행할 파일 경로를 절대경로로 설정해줌

 

※ 이후 파이썬 파일 내 상대경로가 포함되어있을 시 해결방법은 아래에

 

파이썬 설치경로 확인은 (ubuntu의 경우 python3)

which python3

4. cron 로그

내가 설정한 대로 스크립트가 정상적으로 실행되는지 터미널에서는 확인할 수가 없다.

파이썬 스크립트 내에서 print()를 사용했다면, 해당 출력문이 log 파일에 입력되게 된다.

* * * * * /usr/bin/python /home/ubuntu/workspace/main.py >> home/ubuntu/workspace/crontab.log 2>&1
_________ _______________ ______________________________    _________________________________ ____
 시간 설정    파이썬 경로        실행할 파이썬 파일 경로                    cron 로그 경로            갱신

2>&1 부분은 누적해서 작성하는 것이 아닌, 갱신할 경우에만 추가한다.


5. cron 사용 시 주의사항과 에러

내 시간과 서버 시간이 다를 때, 한국 시간으로 변경 방법

# 서버 시간 확인
sudo hwclock --show
# 서버 시간을 한국 시간으로 변경
sudo rm /etc/localtime && sudo ln -s /usr/share/zoneinfo/Asia/Seoul /etc/localtime
# cron 재시작
sudo service cron restart

 


실행하는 파일의 위치를 현재 작업 디렉토리로 설정

  • cron을 실행하면 기본적으로 wd는 /home/ubuntu/
  • 실행할 파일 가장 상단에 Working Directory를 현재 파일위치로 변경해주는 코드 삽입

 

import os 
import pathlib 
# 실행하는 파일의 경로로 현재 작업 디렉토리를 변경 
os.chdir(pathlib.Path(__file__).parent.absolute())

print(os.getcwd())

 


 

mail 관련 에러

 

  • 서버에 sendmail 패키지가 없어서 발생하는 오류
  • 뭐 기타 등등

 

MAILTO=""

 

반응형