cron 작업은 conda 가상 환경에서 실행됩니다.

cron 작업은 conda 가상 환경에서 실행됩니다.

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에 대한 자세한 추론.

축약된 형식은 다음과 같습니다.

~/.bashrc1. 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_condaconda가 에서 코드 조각을 업데이트하는 경우 의 코드 조각이 최신인지 수시로 확인하는 것이 좋습니다 ~/.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.

관련 정보