2017-02-08 27 views
19

他のスタックオーバーフローの問題を見てきましたが、何もできませんでした。私は、環境変数を使用するPythonスクリプトを持っています。このスクリプトは、直接実行したときとまったく同じように動作しますが、今は毎分cronジョブとして実行したいと思います。pythonスクリプトがcronによって実行されたときの環境変数

は、現在、私のcron.dディレクトリに私は含まスクレイパーと呼ばれるファイルがあります:

* * * * * root /usr/bin/python3.5 /code/scraper.py 

をこれはPythonスクリプトを実行しますが、スクリプトは、私は2つの環境変数を使用するスクリプトのように失敗しました。

私は私がやったように、私はcronのファイルにSHELL =/binに/ bashのを追加する必要があります読んで、これは助けにはなりませんでした。

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に「送る」最良の方法は何ですか?

+0

'source〜/ .bashrc && command'またはenv変数が宣言されているファイルを追加して、動作するかどうか確認してください。 – franklinsijo

+0

@franklinsijo申し訳ありませんが、私は何をすべきかはわかりません。 env変数は、コンテナを設定するときにdocker-composeファイルで宣言されます。 –

+0

これらの変数はscraper.pyで使用されるものですか? – franklinsijo

答えて

2

あなたはENV変数のインラインを設定することができます。

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

もう一つの方法は、あなたがたenv変数を使用してファイルを渡すことができhonchoを使用しています。

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

+0

すべてのenv値をcronに渡す方法はありますか? –

+0

環境変数は親プロセスから継承されます。 – fabiocerqueira

3

代わりに私がしたいどのような全体~/.profileを実行するあなたのcronジョブとプロファイルを持つアカウント間で共有されなければならない変数を移動され、その後、私は両方の~/.profileでこれらを調達したいとcronの仕事で

最後に表示された質問の形式が正しくありません。ユーザーIDはスケジューリング情報の直後に来るはずですが、ユーザーIDの前にプロファイルのソースを追加しましたが、これは必ず動作しません。私はテスト目的のために毎分を実行するためにそれを設定した

*/1 * * * * someuser . /tmp/t10/setenv && /usr/bin/python /tmp/t10/test.py 

は、ここで私はここでテストした設定例です。 someuserを意味のあるものに置き換えてください。

export FOO=foovalue 
export BAR=barvalue 

/tmp/t10/test.pyファイルがこれを持っていた:

import os 

print os.environ["FOO"], os.environ["BAR"] 

私のcronのメール私にそれが実行するスクリプトの出力を私が使用/tmp/t10/setenvスクリプトはこれを持っていました。

foovalue barvalue 
+0

'setenv && test.py'は、' setenv 'の' test.py'のシステムコールに相当します。私はtest.pyのシステムコールを1つのファイルに入れる方が良いでしょう。私はこのアプローチが好きです。 – Gang

+0

ありがとう、それは私のためにも完璧に働いた。非常に便利な投稿。 envに2つのvarsを持つ –

1

あなたは、このことによってあなたの2つの環境変数を指定することができます:

$ env A=1 B=2 /bin/sh -c 'echo $A$B' # or just 'sh': would search in $PATH 
12 

* * * * * root env A=1 B=2 /usr/bin/python3.5 /code/scraper.py 

envは、追加の変数で指定されたプログラムを実行するシステムプログラムである私は、この出力とのメールが来ました

+0

、これはうまくいくはずです。 – Gang

0

これは私が好むアプローチの1つです。環境を設定し、そのパラメータをパラメータとしてスクリプトを実行するスクリプトを作成します。

/usr/bin/python3.5 /code/scraper.pyset_env_to_process.sh set_env_to_process.shに対する入力としてとられる

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: [email protected]" 
    eval [email protected] 
fi 

使用は、コマンドライン、クーロン、須藤として使用することができる

を実行するためのスクリプトの正しいENVを設定します、ssh to setup env

* * * * * root set_env_to_process.sh /usr/bin/python3.5 /code/scraper.py 
関連する問題