私は他のスタックオーバーフローの質問を見てきましたが、何も機能しませんでした。環境変数を使用するpythonスクリプト。
現在、私のcron.dディレクトリには、次を含むスクレーパーと呼ばれるファイルがあります。
* * * * * root /usr/bin/python3.5 /code/scraper.py
これはpythonスクリプトを実行しますが、2つの環境変数を使用するスクリプトのようにスクリプトが失敗します。
Shell =/bin/bashをcronファイルに追加する必要があると読んで、そうしましたが、これは役に立ちませんでした。
Shell=/bin/bash
* * * * * root /usr/bin/python3.5 /code/scraper.py
それから私は読んだ
コマンドを実行する前に、crontabでを追加します。 $ HOME/.profile。
Shell=/bin/bash
* * * * * . $HOME/.profile; root /usr/bin/python3.5 /code/scraper.py
しかし、これによりcronの実行が完全に停止しました。 env変数をcronに「送信」する最良の方法は何ですか?
~/.profile
全体を実行する代わりに、cron
ジョブとプロファイルを持つアカウント間で共有する必要がある変数を移動し、~/.profile
およびcronジョブ内。
質問で最後に表示する試みは、適切にフォーマットされていません。ユーザーIDはスケジューリング情報の直後に来るはずですが、ユーザーIDの前にプロファイルのソースを追加しているため、確実に機能しません。
ここで私がテストしたセットアップの例を示します。
*/1 * * * * someuser . /tmp/t10/setenv && /usr/bin/python /tmp/t10/test.py
テスト目的で毎分実行するように設定しました。 someuser
を意味のあるものに置き換えます。私が使用した/tmp/t10/setenv
スクリプトには次のものがありました。
export FOO=foovalue
export BAR=barvalue
/tmp/t10/test.py
ファイルには次のものがありました。
import os
print os.environ["FOO"], os.environ["BAR"]
Cronが、実行するスクリプトの出力を電子メールで送信します。私はこの出力で電子メールを受け取りました:
foovalue barvalue
Env変数をインラインで設定できます。
* * * * * root ENV_VAR=VALUE /usr/bin/python3.5 /code/scraper.py
別の方法は honcho を使用することです。これはenv変数を含むファイルを渡すことができます。
honcho -e /path/to/.env run /code/scraper.py
Crontabの一番上に追加して、バージョン管理の対象から外すことができます。困難を引き起こす環境変数はexport Django_SECRET_KEY="FOOBAR_1241243124312341234"
:
Django_SECRET_KEY="FOOBAR_1241243124312341234"
SCRIPT_NAME = my_cool_script
20 21 * * 1-5 bash ~/git_repo/cronjobs/$SCRIPT_NAME.sh 2&>1 | tee ~/git_repo/cronjobs/logs/$SCRIPT_NAME.log
#!/usr/bin/env bash
~/anaconda3/envs/Django/bin/python ~/git_repo/Django_project/manage.py run_command
問題の環境変数を秘密にする必要があり、既存の.bashrcのロードが何らかの理由でNiceを再生しない場合、これは私にとってはうまくいきました。
これにより、2つの環境変数を指定できます。
* * * * * root env A=1 B=2 /usr/bin/python3.5 /code/scraper.py
env
は、追加の変数を使用して指定されたプログラムを実行するシステムプログラムです。
$ env A=1 B=2 /bin/sh -c 'echo $A$B' # or just 'sh': would search in $PATH
12
これは私が好きなアプローチの1つです。環境を設定するスクリプトを記述し、そのパラメーターとしてパラメーターを使用してスクリプトを実行します
set_env_to_process.sh
#!/usr/bin/env bash
echo "TEST_VAR before export is: <$TEST_VAR>"
export TEST_VAR=/opt/loca/netcdf
echo "TEST_VAR after export is: <$TEST_VAR>"
export PATH=$PATH:/usr/bin/python3.5
export PYTHTONPATH=$PYTHONPATH:/my/installed/pythonpath
# execute command and its parameters as input for this script
if [ $# -eq 0 ]; then
echo "No command to execute"
else
echo "Execute commands with its parameters: $@"
eval $@
fi
使用法
/usr/bin/python3.5 /code/scraper.py
はset_env_to_process.sh
set_env_to_process.sh
の入力として使用されます。実行するスクリプトの正しいenvを設定します
コマンドライン、cron、sudo、sshとして使用してenvをセットアップできます
* * * * * root set_env_to_process.sh /usr/bin/python3.5 /code/scraper.py