Anaconda envを使用してcrontabジョブを実行する 質問する

Anaconda envを使用してcrontabジョブを実行する 質問する

my_env という既存の Anaconda Python 環境を使用して、cron ジョブで Python スクリプトを実行したいと考えています。考えられる唯一の方法は、cron ジョブで というスクリプトを実行し、それmy_script.bashによって env がアクティブ化されてから Python スクリプトが実行されるというものです。

#!/bin/bash
source activate my_env
python ~/my_project/main.py

コマンドラインからこのスクリプトを実行しようとしても機能しません。

$ sh scripts/my_script.bash
scripts/my_script.bash: 9: scripts/my_script.bash: source: not found

適切な環境がアクティブ化されていることを確認するには、何をする必要がありますか。 まるで私が 5 歳児であるかのように説明しても大丈夫です。

ベストアンサー1

かなりいじった後、crontabconda 環境をアクティブ化しconda activate my_env、その環境内で Python インタープリターを実行することができました。

注: 私は Ubuntu 18.04 を使用しています。

背景

  • Anaconda インストーラーが conda を初期化すると、ファイルの末尾にスニペットが追加されます~/.bashrc。このファイルは、ユーザーが対話的に開くたびに実行されます。このスニペットにより、ユーザーはからコマンド (つまり)bashを実行できます。condaconda activate my_envbash

  • Anacondaインストーラv2020.02には以下が追加されましたcondaスニペット~/.bashrc:

# >>> conda initialize >>>
# !! Contents within this block are managed by 'conda init' !!
__conda_setup="$('/opt/anaconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)"
if [ $? -eq 0 ]; then
    eval "$__conda_setup"
else
    if [ -f "/opt/anaconda3/etc/profile.d/conda.sh" ]; then
        . "/opt/anaconda3/etc/profile.d/conda.sh"
    else
        export PATH="/opt/anaconda3/bin:$PATH"
    fi
fi
unset __conda_setup
# <<< conda initialize <<<
  • /opt/anaconda3/正しい参照に置き換えられるパス: 通常は/home/USERNAME/anaconda3/.

問題

ソース入力~/.bashrccrontab -e機能しません (少なくとも Ubuntu では)。

説明:

  • Ubuntu では、~/.bashrcファイルの先頭に次の行 (または同様の行) があります。
# If not running interactively, don't do anything
[ -z "$PS1" ] && return
  • ~/.bashrcこれは、 のファイルをソースしようとすると、が対話的に実行されていないため、ファイルcrontabの残りの部分は.bashrc実行されないことを意味します(別のcrontabこのトピックに投稿する)。つまり、上記のスニペットは、 をソースしてもconda決して実行されません。crontab~/.bashrc

_________ 実用的なソリューション _________

私が見つけた解決策は、condaスニペットを別のファイルにコピーすることです。

1.condaからスニペット~/.bashrcをコピーする~/.bashrc_conda

上記のスニペットを別のファイルにコピーします (例: ) ~/.bashrc_conda

確認しておいて:

  • cronjob を実行しているユーザーには、このファイルを読み取る権限があります。
  • 他のユーザーはこのファイルに書き込むことができません (セキュリティ上のリスク)。

2.の代わりにcrontab -e実行するための2行を挿入し、ソースにbashsh~/.bashrc_conda

実行しcrontab -eて次の2行を追加しますcronジョブの前:

SHELL=/bin/bash
BASH_ENV=~/.bashrc_conda

説明:

  • SHELL=/bin/bashは、(デフォルト)の代わりに をcrontab介して cron ジョブを実行することを意味します。bashsh投稿を見る

  • BASH_ENV=~/.bashrc_conda実行するcondaスニペットのソース。bashchrontab役職そして役職

3.希望するスクリプト実行の前にcrontab -ecronjob行を挿入します。conda activate my_env;.py

目的の conda 環境内で毎日正午 12:30 に実行されるスクリプトのエントリの例:

30 12 * * * conda activate my_env; python /path/to/script.py

conda activate my_env;Python インタープリターを実行するコマンドの前に注意してください。

_______________

そしてほら、 出来た。

欠点はありますか?

condaスニペットがアップデート.bashrcによって更新された場合conda、もちろん別のファイルには反映されません.bashrc_conda。時々アップデートを確認する必要があるかもしれません。

また; conda deactivate終わりその cronjob ですが、これは冗長かもしれません。

おすすめ記事