我一直在关注其他堆栈溢出问题但无法正常工作。我有一个使用环境变量的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的最佳方法是什么?
答案 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"
:
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时,这对我来说都很有效。
答案 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