环境变量当cron运行python脚本时

时间:2017-02-08 13:52:07

标签: python cron environment-variables

我一直在关注其他堆栈溢出问题但无法正常工作。我有一个使用环境变量的python脚本。这个脚本在直接运行时完全按计划运行,但是我想暂时每分钟将它作为一个cron作业运行。

目前在我的cron.d目录中,我有一个名为scrapers的文件,其中包含:

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

这会运行python脚本,但脚本会失败,因为在脚本中我使用了两个环境变量。

我读过我应该将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的最佳方法是什么?

5 个答案:

答案 0 :(得分:5)

而不是执行整个~/.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

答案 1 :(得分:3)

您可以设置内联的env变量:

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

另一种方法是使用honcho,您可以使用env变量传递文件。

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

答案 2 :(得分:1)

您可以通过以下方式指定两个环境变量:

* * * * * 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

答案 3 :(得分:1)

您可以将其添加到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时,这对我来说都很有效。

答案 4 :(得分:0)

这是我喜欢的方法之一,编写脚本来设置环境并以参数作为参数执行脚本

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