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

おすすめ記事