안녕하세요, 오늘은 Crontab에서 Python 스크립트 실행 시 모듈 오류 해결 방법을 소개해보려고 합니다.
🔍 문제 상황
리눅스 서버에서 Crontab을 사용해 Python 스크립트를 주기적으로 실행하려 했습니다.
하지만 Crontab에서는 ModuleNotFoundError 오류가 발생했고, 터미널에서 직접 실행할 때는 오류가 발생하지 않았습니다.
Crontab 설정
처음 설정한 Crontab은 다음과 같았습니다.
- crontab -e로 설정(nano 에디터)
05 13 * * * python3 /path/test.py -t MTBC >> /data/log/cron.log 2>&1
오류 발생
Crontab 실행 후 cron.log에서 확인한 오류는 ModuleNotFoundError였습니다.
터미널에서 python3 /path/test.py -t MTBC를 실행하면 정상적으로 동작했기 때문에, Crontab 환경의 문제로 판단했습니다.
원인 분석
Crontab에서 Python 스크립트가 모듈을 찾지 못한 이유는 다음과 같습니다.
- 환경 변수 설정 필요
작성한 Python 스크립트가 Oracle 데이터베이스와 연동되며, 이를 위해 ORACLE_HOME, LD_LIBRARY_PATH 등의 환경 변수가 필요했습니다. 터미널에서는 이미 설정된 환경 변수가 있었지만, Crontab에서는 설정되지 않았습니다. - 제한된 환경 변수
Crontab은 셸 환경과 달리 제한된 환경 변수로 실행됩니다. PYTHONPATH나 작업 디렉토리가 설정되지 않아 lib 모듈을 찾지 못했습니다. - 작업 디렉토리 불일치
Crontab은 기본적으로 홈 디렉토리(~)에서 실행됩니다. scheduler_process.py가 lib 모듈을 상대 경로로 참조하고 있다면, Crontab에서는 모듈 경로를 찾지 못합니다
⛏️ 시도한 해결책들
문제를 해결하기 위해 다음 단계를 거쳤습니다.
1. Crontab 동작 확인
먼저 Crontab 데몬이 실행 중인지 확인했습니다.
systemctl status cron
데몬이 정상적으로 실행 중이었고, Crontab 설정도 crontab -l로 확인해 올바르게 적용되었음을 확인했습니다.
2. 작업 디렉토리 설정 시도
Crontab에서 작업 디렉토리를 명시적으로 설정해 보았습니다.
05 13 * * * cd /home/msrtcs/scheduler && /usr/bin/python3 /home/msrtcs/scheduler/scheduler_process.py -t MTBC >> /home/msrtcs/scheduler/scheduler.log 2>&1
하지만 여전히 ModuleNotFoundError가 발생했습니다. 이는 스크립트에서 사용하고 있는 lib 모듈이 상대 경로로 참조되고, Crontab 환경에서 PYTHONPATH가 설정되지 않은 탓이었습니다.
💡 최종 방법
환경 변수 설정용 쉘 스크립트 작성
환경변수가 설정되지 않은 상태에서 파이썬 스크립트가 실행되는 게 문제라면, 환경변수를 설정한 후 파이썬 스크립트를 실행하면 되지 않나 ? 라는 생각이 들었습니다.
그래서 bash_profile이나 bashrc 파일에서 적용하는 환경변수를 그대로 옮긴 후 원하는 파이썬 스크립트를 실행하는 식으로 path_set.sh라는 쉘 스크립트를 작성했습니다.
export PATH=본인 환경변수 설정
export 다른 환경변수
...
python3 /path/test.py -t MTBC
Crontab 수정
Crontab에서 path_set.sh를 호출하도록 수정했습니다.
0 9 * * * /bin/bash /path/path_set.sh >> /data/log/cron.log 2>&1
👀 Tips
- 로그 디렉토리 권한: cron 로그를 작성할 수 있게, /data/log/ 디렉토리에 쓰기 권한이 있는지 확인하세요.
- Python 경로 확인: Crontab과 터미널에서 동일한 Python 버전을 사용하는지 확인
- 절대경로 사용: crontab 설정에서 사용하는 경로는 절대경로를 사용하자 !
🔚 마무리
리눅스 환경에서 발생하는 오류의 대부분은 권한 문제이거나, 환경변수 설정 문제이므로, 어떤 문제가 발생한다면 해당 부분을 먼저 확인하는 걸 추천한다.
'삽질' 카테고리의 다른 글
[FTP] FTP 전송 시 파일 끝부분이 잘리는 오류 (0) | 2025.05.04 |
---|---|
[Database Navigator] IntelliJ Community 버전에서 DB 도구 사용하기 (0) | 2025.04.30 |