cron 运行脚本时的环境变量

新手上路,请多包涵

我有一个使用环境变量的 Python 脚本。该脚本直接运行时完全按照计划工作;但是,我想暂时将它作为 cron 作业每分钟运行一次。

目前在我的 cron. 目录中,我有一个名为 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 的最佳方式是什么?

原文由 user6723321 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 608
1 个回答

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

原文由 Louis 发布,翻译遵循 CC BY-SA 3.0 许可协议

推荐问题