OS/Ubuntu

가상환경과 크론탭을 활용하여 파이썬 스크립트 실행시 에러 해결

makeitworth 2023. 10. 5. 08:50

환경

tested on

Python 3.9.12
macOS 13.2.1(22D68)
cpu apple M1 10core

현상

AWS RDS에서 정보를 가져오고 일정 조건에 해당되는 영상 파일을 S3 링크에서 다운로드 받고, 영상 파일과 메타 데이터를 처리한 다음, 그 결과를 구글 클라우드 API를 활용하여 특정 구글 드라이브에 업로드하는 파일을 만들었다.
그리고 이 파일을 매일 자동으로 실행하기 위해, 파이프라인 구축 하기 전에 간단하게 로컬에서 크론탭을 사용하여 매일 1회 자동 파일 실행을 설정했으나 파일 실행이 되지 않는 문제 발생

Log

크론으로 실행된 파일의 output은 터미널에 프린팅되지 않기 때문에 로그에 기록할 필요가 있음

(참고) 파일 실행의 결과를 로그 기록하게 설정하는 크론 명령어


* * * * * python test.py > /home/log/test.log 2>&1
* * * * * python test.py >> /home/log/test.log 2>&1
# > /home/log/test.log 스크립트의 표준출력을 /home/log/test.log 경로로 리다이렉트함
# >> /home/log/test.log 위와 동일하게 표준출력을 저장하나 기준 로그파일에 누적하여 저장
# 2>&1: 표준 오류(2)를 표준 출력(1)으로 리다이렉트, 즉 오류 메시지를 log에 저장

* * * * * python test.py > /dev/null 2>&1
# > /dev/null: 표준 출력을 /dev/null로 리다이렉트함. 
#'dev/null'은 표준출력을 버리는데 사용하는 특수한 파일 : 따라서 로그 저장 안함
# 2>&1: 표준 오류(2)도 /dev/null로 리다이렉트하기 때문에 저장 안함

기존의 블로그에서 추천해준대로 가상환경의 절대 경로와 실행하고자 하는 파이썬 파일의 절대경로를 명시에서 크론 명령어를 저장했을 때의 명령어 (실행 안됨)

* * * * * /home/dev/myvenv/bin/python /home/dev/my_project/test.py >> /Users/dev/my_project/test.log 2>&1
# 테스트용으로 매분마다 실행되게 설정했음

아래와 같은 에러 메시지가 로그에 찍혔다.

Traceback (most recent call last):
  File "/home/dev/my_project/test.py", line 16, in <module>
    'port':int(os.getenv('aws_port')),
TypeError: int() argument must be a string, a bytes-like object or a number, not 'NoneType'

aws 나 google cloud api 등을 사용하고 있어서 여러 환경 변수를 .env에 저장하고 dotenv 라이브러리를 사용하여 불러오고 있었는데, .env 파일을 제대로 가져오지 못하는 것 같음

시도해본 방법

https://teddylee777.github.io/linux/python-가상환경-crontab-주기마다-실행/

[Python] 가상환경(pyenv-virtualenv) 파이썬을 crontab에서 실행하기
파이썬 파일을 가상환경에서 실행하는 방법에 대하여 몇가지 블로그를 검색하여 확인했지만, 여전히 파일이 제대로 실행되지 않음

해결 방법

문제의 원인은 크론 명령어가 root directory에서 실행된다는 것임

그래서 crontab에 python 경로와 실행파일 경로를 절대경로로 입력하는 것인데, 파이썬 실행파일 안의 코드에서 다양한 다른 파일들을 상대경로로 가져와서 작업하기 때문에 실행이 안되는 거였음

따라서 아예 크론 명령어 안에서 프로젝트 디렉토리로 이동한 다음 작업을 실행하면 됨

* * * * * cd /home/dev/ && source my_venv/bin/activate && python my_project/test.py >> my_project/test.log 2>&1

향후 개선해야할 방향

crontab으로 파일을 자동실행하는 방식은 여러 한계가 많음. 예를 들어 데이터가 많아지기 시작하면 분산처리가 필요한데 현재 같은 방식으로는 불가능함

예를 들어 Amazon SQS와 같은 메시지큐를 활용하여 데이터파이프라인을 구축할 필요가 있음