TIL/삽질 기록소

[Debug]crontab으로 python 파일 실행

JoJobum 2022. 10. 27.

문제 상황

내가 원하는 것은 cron을 활용하여 매일 특정 시간에 추천 주제를 쌓아둔 DB에 접근하여 랜덤으로 값을 뽑아 다른 DB에 값을 써주는 작업을 하고 싶었다.

 

1. 앞서 말한 내가 원하는 작업을 python 파일로 작성

2. 이것을 crontab을 활용하여 실행

 

이렇게 진행하였는데 이제 1번은 완성되어 python3 main.py 이런식으로 동작시키면 원하는대로 동작하는 상황에서 

crontab으로 main.py 를 동작시키면서 마주했던 에러들에 대해 작성해보자 한다.

 

 

해결 과정

내가 사용했던 ubuntu 기준으로 /var/log 의 syslog 파일에 cron관련 로그가 쌓였다.

# CRON 관련 로그만 볼 수 있음
grep CRON syslog

 

No MTA installed, discarding output

 

우선 이러한 에러가 발생한 이유는 cron이 돌고 나서 발생하는 output을 메일 시스템을 통해서 우리에게 보내주려고 하는데 MTA(mail transfer agent) 즉 메일을 보내주는 시스템이 안깔려있어서 에러가 발생하는 것이였다.

이러한 부분을 해결하기 위해서는

1. MTA를 깔아준다 

2. output을 보내주지 않게 설정값을 건드린다.

 

나는 MTA를 깔아주는 방식을 채택하였고, 구글링을 하다가 보면 설치할 때 로컬 환경으로 해야 한다는 내용도 있었지만 나같은 경우 실수로 internet 버전인가 다른 것으로 하였는데 문제없었다. ( 추후에 제대로 동작하지 않았을 때 혹시 이게 문제가 아닐까라는 의심도 했었지만 아니였다)

 

 

 

환경변수와 절대경로

절대경로를 해야 문제가 없다는 것

그리고 cron은 기존에 설정해둔 환경변수를 읽지 못하는 부분이 가장 날 괴롭힌 부분이였다.

 

crontab -e
# m h  dom mon dow   command
* * * * * /usr/bin/python3 /home/ubuntu/withyou-batch/main.py

이런식으로 하면 된다는 글이 많았는데 이렇게 하면 main.py에서 어떤걸 import하거나 환경변수를 사용하는 경우 제대로 동작하지 않느다. 왜냐하면 앞서 말했듯이 cron으로 돌리면 얘가 환경변수나 파이썬 라이브러리의 Path를 다 모르기 때문이다.

 

더 골치 아픈 부분은 앞서 MTA 에러를 발견했듯이 로그가 남아있으면 어떠한 문제인지 알 수 있는데, 이 경우 command에 로그 찍는 command를 추가해주지 않으면 무슨 에러인지 알 수 조차 없다.

 

# m h  dom mon dow   command
* * * * * PYTHONPATH=(파이썬 라이브러리 절대경로) (실행파일 절대 경로) >> (로그파일 절대경로)/(로그파일명).log 2>&1


# m h  dom mon dow   command
* * * * * PYTHONPATH=/home/ubuntu/.local/lib/python3.8/site-packages/ /home/ubuntu/withyou-batch/familylog.sh >> /home/ubuntu/withyou-batch/log.log 2>&1

위처럼 기존 커맨드에 >> 로그파일 절대 경로/파일명.log 2>&1 을 붙여주면 해당 경로에 로그가 쌓이고

만약 파이썬 환경변수를 넣어주지 않았다면 파이썬 라이브러리를 import하는 부분에서 python module not found 에러가 발생했을 것이다.

파이썬 환경 변수 설정없이 postgresql을 접근할 수 있게 해주는 모듈을 사용했기에 마주했던 에러 메세지

 

DB 관련 설정을 환경변수로 빼서 처리했는데 환경변수가 누락되면서 발생한 에러

 

 

 

그외로 다른 환경 변수이 날라가는 부분은 어떻게 처리하였냐면

나같은 경우 내가 필요한 환경변수와 python 파일을 동작하는 부분을 쉘 스크립트로 새로 만들어 이를 실행 시키는 방법으로 처리하였다.

# /home/ubuntu/withyou-batch/familylog.sh 
export MYSQL_HOST=''
export MYSQL_USER_NAME=''
export MYSQL_PASSWORD=''
export MYSQL_DATABASE=''
export POSTGRES_HOST=''
export POSTGRES_USER_NAME=''
export POSTGRES_PASSWORD=''
export POSTGRES_DATABASE=''
python3 /home/ubuntu/withyou-batch/main.py

 

간단하다면 간단한 부분인데 에러 발생 원인이랑 구글링에서 뭔가 명확한 답을 찾기가 어려웠어서 헤맨 부분이 있어 정리해봤다.

 

반응형

댓글