
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
。