由cron运行python脚本时的环境变量
我一直在研究其他堆栈溢出问题,但没有找到任何可行的方法。我有一个使用环境变量的python脚本。这个脚本在直接运行时完全按照计划工作,但是,目前我希望每分钟都将它作为cron作业运行 目前在我的cron.d目录中有一个名为scrapers的文件,其中包含:由cron运行python脚本时的环境变量,python,cron,environment-variables,Python,Cron,Environment Variables,我一直在研究其他堆栈溢出问题,但没有找到任何可行的方法。我有一个使用环境变量的python脚本。这个脚本在直接运行时完全按照计划工作,但是,目前我希望每分钟都将它作为cron作业运行 目前在我的cron.d目录中有一个名为scrapers的文件,其中包含: * * * * * root /usr/bin/python3.5 /code/scraper.py 这将运行python脚本,但脚本失败,因为在脚本中我使用了两个环境变量 我读到我应该将SHELL=/bin/bash添加到cron文件中,
* * * * * 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
但这导致cron完全停止运行。将环境变量“发送”到cron的最佳方式是什么?您可以内联设置环境变量:
***root ENV_VAR=VALUE/usr/bin/python3.5/code/scraper.py
另一种方法是使用env变量传递文件
honcho-e/path/to/.env run/code/scraper.py
而不是执行整个~/.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
import os
print os.environ["FOO"], os.environ["BAR"]
/tmp/t10/test.py
文件包含以下内容:
export FOO=foovalue
export BAR=barvalue
import os
print os.environ["FOO"], os.environ["BAR"]
我的cron通过电子邮件向我发送它运行的脚本的输出。我收到了一封带有以下输出的电子邮件:
foovalue barvalue
您可以通过以下方式指定两个环境变量:
* * * * * 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
这是我喜欢的方法之一,编写一个脚本来设置环境,并以其参数作为参数执行脚本 将_env_设置为_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
您可以将其添加到crontab的顶部,使其不受版本控制。假设造成您困难的环境变量是
export DJANGO\u SECRET\u KEY=“FOOBAR\u 1241243124312341234”
:
克朗塔布
我的_cool_script.sh
当环境变量需要保密且加载现有的.bashrc时,这对我来说非常有效。尝试添加
source~/.bashrc&&command
或声明环境变量的文件,看看它是否有效。@franklinsijo抱歉,我不太确定我应该做什么。设置容器时,环境变量在docker compose文件中声明。这些变量将由scraper.py?@franklinsijo yes.AFAIK使用。即使会话关闭,环境变量也必须在文件(配置文件)中设置为可用。或者您可以使用export
命令为该会话设置变量。是否有方法让所有的env值通过cron?env变量从父进程继承。setenv&&test.py
,相当于setenv
中的系统调用test.py
,它肯定会并且应该会工作,将test.py的系统调用放在一个文件中的方法比我的方法更好。我喜欢这种方法。
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