web-dev-qa-db-ja.com

python cronによって実行されるスクリプトの場合の環境変数

私は他のスタックオーバーフローの質問を見てきましたが、何も機能しませんでした。環境変数を使用する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に「送信」する最良の方法は何ですか?

23
user6723321

~/.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
5
Louis

Env変数をインラインで設定できます。

* * * * * root ENV_VAR=VALUE /usr/bin/python3.5 /code/scraper.py

別の方法は honcho を使用することです。これはenv変数を含むファイルを渡すことができます。

honcho -e /path/to/.env run /code/scraper.py

3
fabiocerqueira

Crontabの一番上に追加して、バージョン管理の対象から外すことができます。困難を引き起こす環境変数はexport Django_SECRET_KEY="FOOBAR_1241243124312341234"

crontab

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

my_cool_script.sh

#!/usr/bin/env bash
~/anaconda3/envs/Django/bin/python ~/git_repo/Django_project/manage.py run_command

問題の環境変数を秘密にする必要があり、既存の.bashrcのロードが何らかの理由でNiceを再生しない場合、これは私にとってはうまくいきました。

1
Scott Skiles

これにより、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
Kirill Bulygin

これは私が好きなアプローチの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.pyset_env_to_process.shset_env_to_process.shの入力として使用されます。実行するスクリプトの正しいenvを設定します

コマンドライン、cron、sudo、sshとして使用してenvをセットアップできます

 * * * * * root set_env_to_process.sh /usr/bin/python3.5 /code/scraper.py
0
Gang