Anaconda Python 가상 환경을 설정했는데 해당 가상 환경을 활성화하는 동안 프로젝트를 실행하면 모든 것이 잘 실행됩니다.
하지만 매시간 실행되도록 구성된 cronjob이 있습니다. 제대로 실행되지 않았기 때문에 출력을 로그에 파이프했습니다.
crontab -e
:
10 * * * * bash /work/sql_server_etl/src/python/run_parallel_workflow.sh >> /home/etlservice/cronlog.log 2>&1
cronlog.log에 다음 오류가 발생합니다.
Traceback (most recent call last):
File "__parallel_workflow.py", line 10, in <module>
import yaml
ImportError: No module named yaml
이는 가상 환경을 활성화하지 않으면 cronjob이 파일을 실행할 수 없음을 나타냅니다.
이 문제를 해결하기 위해 파일에 다음 줄을 추가했습니다 /home/user/.bash_profile
.
conda activate ~/anaconda3/envs/sql_server_etl/
이제 로그인하면 환경이 자동으로 활성화됩니다.
그러나 문제는 남아 있습니다.
나는 한 가지를 더 시도했다. cronjob이 실행될 때마다 명시적으로 수동으로 환경을 활성화하기 위해 cronjob을 변경했습니다(cronjob이 실행되는 bash 파일에서도 이 작업을 시도했지만 소용이 없었습니다).
10 * * * * conda activate ~/anaconda3/envs/sql_server_etl/ && bash /work/sql_server_etl/src/python/run_parallel_workflow.sh >> /home/etlservice/cronlog.log 2>&1
물론 내가 시도한 어떤 것도 문제를 해결하지 못했습니다. 저는 Linux에 대해 전혀 모릅니다. 따라서 변경해야 할 사항이 분명 있을 수도 있습니다.
그렇다면 cronjob이 가상 환경에서 실행되도록 지정하는 방법이 있습니까?
답변1
발표작업 솔루션(Ubuntu 18.04) 및 SO에 대한 자세한 추론.
축약된 형식은 다음과 같습니다.
~/.bashrc
1. Anaconda가 파일 끝에 추가한 코드 조각을 별도의 파일에 복사합니다.~/.bashrc_conda
Anaconda 2020.02 설치부터 코드 조각은 다음과 같습니다.
# >>> conda initialize >>>
# !! Contents within this block are managed by 'conda init' !!
__conda_setup="$('/home/USERNAME/anaconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)"
if [ $? -eq 0 ]; then
eval "$__conda_setup"
else
if [ -f "/home/USERNAME/anaconda3/etc/profile.d/conda.sh" ]; then
. "/home/USERNAME/anaconda3/etc/profile.d/conda.sh"
else
export PATH="/home/USERNAME/anaconda3/bin:$PATH"
fi
fi
unset __conda_setup
# <<< conda initialize <<<
확실하게 하다:
- 경로가
/home/USERNAME/anaconda3/
정확합니다. - cronjob을 실행하는 사용자는 다음과 같습니다.읽기 권한(
~/.bashrc_conda
그리고 다른 사용자는 이 파일에 쓸 수 없습니다).
2. 소스 crontab -e
에서 cronjob을 실행하는 라인을 추가합니다.bash
~/.bashrc_conda
crontab -e
다음을 실행 하고 삽입하세요.cronjob 이전:
SHELL=/bin/bash
BASH_ENV=~/.bashrc_conda
3. 예시에 표시된 대로 cronjob 시작 부분 에 crontab -e
포함합니다 .conda activate my_env;
매일 오후 12시 30분에 conda 환경의 Python 인터프리터에서 실행되는 스크립트 항목의 예:
30 12 * * * conda activate my_env; python /path/to/script.py; conda deactivate
그게 다야.
~/.bashrc_conda
conda가 에서 코드 조각을 업데이트하는 경우 의 코드 조각이 최신인지 수시로 확인하는 것이 좋습니다 ~/.bashrc
.
답변2
이것은 나에게 잘 맞는 솔루션입니다.
source /root/miniconda3/etc/profile.d/conda.sh && \
conda activate <your_env> && \
python <your_application> &
Ubuntu 18.04.3 LTS에서 miniconda 및 Conda 버전 4.7.12를 사용하고 있습니다.
위의 내용을 스크립트에 넣고 문제 없이 crontab을 통해 실행할 수 있습니다.
답변3
Stack Overflow에서 답을 찾았습니다.
https://stackoverflow.com/questions/3287038/cron-and-virtualenv
해결책은 가상 환경 자체에서 Python 실행 파일을 참조하는 것입니다. 내 경우에는 이 실행 파일을 실행하기 위해 bash 파일을 변경했습니다.
/home/etlservice/anaconda3/envs/sql_server_etl/bin/python
답변4
이 솔루션나를 위해 작동합니다.
사용해 보세요
source /path/to/conda/bin/activate my_env
바꾸다
conda activate my_env
bash 스크립트에서 run_parallel_workflow.sh
.